#heap-allocation #allocator #performance #cache #locality #effect #object

shuffling-allocator

一个洗牌分配器,随机化堆对象的位置;在基准测试中,有助于避免意外的缓存局部性,这可能会掩盖性能评估

4个稳定版本

1.1.2 2021年1月21日
1.1.1 2021年1月12日
1.0.0 2021年1月12日

#281 in 内存管理

Download history 1270/week @ 2024-03-27 2090/week @ 2024-04-03 3368/week @ 2024-04-10 3507/week @ 2024-04-17 3569/week @ 2024-04-24 4213/week @ 2024-05-01 4528/week @ 2024-05-08 9660/week @ 2024-05-15 6501/week @ 2024-05-22 9569/week @ 2024-05-29 8415/week @ 2024-06-05 12852/week @ 2024-06-12 10728/week @ 2024-06-19 12757/week @ 2024-06-26 7896/week @ 2024-07-03 8220/week @ 2024-07-10

41,757每月下载

MPL-2.0 许可证

27KB
591

shuffling-allocator

一个洗牌分配器。

此crate提供ShufflingAllocator类型,该类型包装现有分配器并洗牌其产生的堆分配顺序,从而有效地随机化堆分配的位置。

随机化堆分配的位置对于测试、基准测试和性能评估很有用。它有助于您将给定代码更改的性能影响与意外的堆对象局部性和这种影响分开,这种影响可能是由于CPU中的内存缓存造成的。这是此crate关注的用例。

虽然随机化堆分配的位置也可以用于深度防御安全,类似于ASLR,但此crate不是为此用例编写的。因此,如果您的用例是深度防御安全用例,则此crate可能不是最佳选择。此crate的实现中可能做出的某些权衡和设计决策可能不是您用例所需的。

此crate受到Curtsinger和Berger在Stabilizer: Statistically Sound Performance Evaluation by Curtsinger and Berger中描述的分配器的启发。

它是如何工作的?

对于每个尺寸类,始终维护一个可用对象数组。分配新对象涉及进行分配,选择数组中的一个随机索引,交换array[i]中的新分配,并返回被交换出的值。释放对象的过程类似:在数组中选择一个随机索引,将正在释放的指针与array[i]交换,然后使用底层分配器实际释放被交换出的指针。堆分配随机化的层次数组越大,我们得到的真正随机堆分配就越接近,但同时也带来了更大的开销。Curtsinger和Berger发现,大小为256的数组在可接受的开销下提供了良好的随机化,这也是此crate使用的数组大小。

示例

将系统分配器包裹在ShufflingAllocator中,随机化系统分配器堆对象的位置

use shuffling_allocator::ShufflingAllocator;
use std::alloc::System;

static SHUFFLED_SYSTEM_ALLOC: ShufflingAllocator<System> =
    shuffling_allocator::wrap!(&System);

依赖关系

~240–520KB