项目地址:http://code.google.com/p/febird
使用 libavl 中的 trb ,经过修改,实现了一个更高效更友好易用的版本,并且也支持范围查询,提供完备的std::map/set接口。
- 对基本类型的key,实现高效search
- 支持 lower_bound/upper_bound/equal_range
- 结点采用压缩方式,将colorbit(1bit)和tagbit(2bit)压缩到指针中
- 从而每个结点的overhead是2ptr(32位环境下8byte,64位环境下16bits)
- stl::map/stl::set 的节点overhead 一般是 4ptr
- 遍历tree的速度比stl::map/set快一倍
- 线索树的线索(thread)可以直接访问next/prev,而不需要回溯到祖先结点再访问其最左/右叶子
- 通过线索(thread)直接访问到next/prev的概率大约有50%
- key的访问使用fieldoffset,C标准中有 offsetof(T,f) 宏来计算字段偏移
- 因为使用C模拟template,从而没有C++的代码膨胀问题
- C接口需要手工打造vtable
- vtable指针通过参数传递,而不是将它作为trb_tree的一部分,更节约内存
- 也许仅仅一个vtable指针用不了多少内存
- 但是当有若干个【在我的应用中,大约2M个】trb_tree时,节省的内存相当可观
- 使用C实现核心功能,同时提供更易用的C++接口(trbset/trbmap/trbtab)
- 类似stl中的相应东西
- trbset相当于stl::set
- trbmap相当于stl::map
- trbtab提供更多的控制
- C++接口只是一个语法糖wrapper,将调用转发到C,但是使用C++可以避免几乎一切误用
- C++将vtable作为模板的static成员,非常合理,非常恰到好处
以前我写过两篇文章:
在 C 语言中实现模板函数的方法
在 C 语言中实现模板函数的方法(续)
对基本类型的key,实现高效search,其核心思想就来源于这两篇文章,但是有许多精化。其间使用了更之前的一些东西:
- 基本类型enum
- 类型迭代(使用preprocessor)
基本类型enum,使用enum的目的在于:使用这个enum,查找到相应的处理函数。
类型迭代:p_field_type_loop.h
在包含该文件之前,需要定义 FIELD_TYPE_FILE ,从而p_field_type_loop.h可以作为一个通用的代码生成器。在FIELD_TYPE_FILE中,实现具体的代码,在需要参数化类型的地方,使用FIELD_TYPE_TYPE来代替。FIELD_TYPE_PROMOTED用来提升相应的FIELD_TYPE_TYPE,例如 signed char 被提升到 int,float 被提升到double,这一点,在使用C的vararg时是绝对必要的。
另外,在包含该文件之前,还要将FIELD_TYPE_FILE中实现的函数名定义成宏,如:
以trb_find_xx为例,当trb_find_xx被展开后,变成trb_find_tev_double等等。
为什么要搞这么多呢?因为在这些函数中,对key值的大小比较实际上是个trivial操作,而一般传统的方法是传递一个compare函数指针,通过该指针调用compare函数,来实现灵活性(对任意类型的key)。
但是,通过函数指针调用一个非常trivial的操作,有很多不必要的性能损失(经过测试,对int的key,trb_find_xx会慢20%~80%,服务器GCC+至强2.29G中慢20%,台式机VC+奔腾2.49G中慢80%)。
使用这种编程范式,可以在不必造成冗余代码的情况下,大幅提升性能。
使用:
#include <febird/c/trb.h> // for C
#include <febird/trb_cxx.h> // for C++
trbmap<string, int> m1; // equivalent to std::map<string, int>
全部的代码在这里
分享到:
相关推荐
红黑树(Red-Black Tree) 伸展树(Splay Tree) B-树(B-Tree) 线索二叉树(Threaded Binary Tree) 前缀树/字典树(Trie) 5. 哈希/散列(Hashing) 哈希表(Hash Table) 哈希函数(Hash Functions) 6. 优先...
红黑树(Red-Black Tree) 伸展树(Splay Tree) B-树(B-Tree) 线索二叉树(Threaded Binary Tree) 前缀树/字典树(Trie) 5. 哈希/散列(Hashing) 哈希表(Hash Table) 哈希函数(Hash Functions) 6. 优先...
Red-black tree 195 AA tree 210 Scapegoat tree 215 Splay tree 219 T-tree 234 Rope 237 Top Trees 242 Tango Trees 246 Van Emde Boas tree 268 Cartesian tree 272 Treap 277 B-trees 281 B-tree 281 B+ tree ...
《多线程与网络编程:理解“threaded-syn-port-scanner-2.0”工具》 在IT领域,端口扫描是网络安全和系统管理的重要技术之一,它可以帮助我们了解网络上服务的状态和开放的端口。"threaded-syn-port-scanner-2.0....
标题中的"threaded-0.7.0-cp35-cp35m-manylinux1_x86_64.whl"是一个Python的轮子文件(wheel file),它是一种预编译的Python软件包格式,使得用户可以直接安装而无需通过源代码进行编译。这个文件的命名结构包含了...
python库。资源全名:threaded-3.0.1-cp35-cp35m-win_amd64.whl
标题 "rknn-multi-threaded-nosigmoid.zip" 暗示了这个压缩包可能包含一个或多个关于RKNN(RISC-V Neural Network Kernel)的多线程实现,并且在模型中省略了Sigmoid激活函数。RKNN是针对RISC-V架构优化的神经网络...
标题中的"PyPI 官网下载 | threaded-4.1.0-cp38-cp38-manylinux2014_i686.whl"指的是一个Python软件包,它在Python的包索引(PyPI)官网上可以下载到。PyPI是Python开发者发布自己创建的库和模块的地方,方便其他...
本项目名为"Single-threaded-file-transfer.zip_single",其核心内容是实现了一个单线程的文件传输机制,不包含断点续传功能,但以性能优化为亮点。 单线程文件传输是指在执行文件传输时,整个过程只使用一个线程来...
资源来自pypi官网。 资源全名:threaded-3.0.3-cp35-cp35m-manylinux1_x86_64.whl
资源来自pypi官网。 资源全名:threaded-0.7.0-cp35-cp35m-manylinux1_x86_64.whl
资源分类:Python库 所属语言:Python 资源全名:threaded-4.1.0-cp37-cp37m-win_amd64.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
标题中的"threaded-3.0.3-cp35-cp35m-manylinux1_x86_64.whl"是一个Python库的发行版本,这个库名为"threaded",版本号为3.0.3。"cp35"指的是它适用于Python 3.5版本,"cp35m"表示它是一个编译版,其中"m"可能代表...
资源分类:Python库 所属语言:Python 资源全名:threaded-2.0.2-cp35-cp35m-manylinux1_i686.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
标题中的“single-threaded-tcp-scanner.rar_single”暗示了这是一个关于单线程TCP扫描器的编程资源,可能是一个源代码包。描述确认了这一点,它指出这是使用C++编程语言实现的一个扫描器,主要关注单线程TCP扫描器...