6个版本
0.8.4 | 2020年10月20日 |
---|---|
0.8.3 | 2020年10月16日 |
0.8.2 | 2020年9月28日 |
0.1.0 | 2020年9月27日 |
#463 in 内存管理
155KB
2.5K SLoC
shared-arena
线程安全且高效的内存池
当需要分配和释放大量相同大小的数据时,内存池非常有用。
使用内存池可以加快这些分配/释放操作。
本crate提供了3种内存池
性能
在我的笔记本电脑上,运行Clear Linux OS 33840,使用Intel i7-10750H,使用shared_arena进行分配比系统分配器快6到8倍
SingleAlloc/SharedArena time: [12.153 ns 12.423 ns 12.724 ns]
SingleAlloc/Arena time: [9.2267 ns 9.4895 ns 9.7559 ns]
SingleAlloc/Pool time: [8.8624 ns 8.9305 ns 9.0033 ns]
SingleAlloc/Box (System Allocator) time: [71.042 ns 72.995 ns 74.442 ns]
更多分配的性能
该图形是用criterion生成的,可以通过以下命令重现:cargo bench
实现细节
SharedArena
、Arena
和Pool
使用相同的分配方法,该方法源自free list。
它们按页面分配,每个页面包含63个元素,并保持一个页面列表,其中至少有一个元素未被用户使用。
一个页面有一个64位的位字段,每个位指示元素是否被使用。
在这个位字段中,如果位被设置为0,则元素已被使用。
因此,计算尾部零的数量给出了未使用元素的索引。
只需1个CPU指令即可找到未使用的元素:例如在x86
上的tzcnt/
bsf
和在arm
上的clz
。
[..]1101101000
在上面的位字段中,第4个元素未被使用。
SharedArena/
Arena
和Pool
之间的区别是Pool
不使用原子操作。
安全性
在几个地方使用unsafe
块来解除引用指针。
代码在每次提交时都由miri解释器、valgrind和3个sanitizers:地址、泄露和内存覆盖。
请参阅github actions
依赖
~42KB