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 内存管理

MIT许可证

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

实现细节

SharedArenaArenaPool使用相同的分配方法,该方法源自free list

它们按页面分配,每个页面包含63个元素,并保持一个页面列表,其中至少有一个元素未被用户使用。
一个页面有一个64位的位字段,每个位指示元素是否被使用。

在这个位字段中,如果位被设置为0,则元素已被使用。
因此,计算尾部零的数量给出了未使用元素的索引。
只需1个CPU指令即可找到未使用的元素:例如在x86上的tzcnt/bsf和在arm上的clz

[..]1101101000

在上面的位字段中,第4个元素未被使用。

SharedArena/ArenaPool之间的区别是Pool不使用原子操作。

安全性

在几个地方使用unsafe块来解除引用指针。
代码在每次提交时都由miri解释器、valgrind和3个sanitizers:地址、泄露和内存覆盖。
请参阅github actions

依赖

~42KB