通读 The Apache Modules Book,我在第 3.4.3 部分看到了这个声明:
"A secondary benefit is that pool allocation is faster than malloc on most platforms!"
我意识到这是一个悬而未决的问题,但是......好吧,为什么?
最佳答案
除了 Lars 关于局部性的观点之外,池分配只是一种与 malloc
不同的速度/灵 active 权衡。
malloc
必须跟踪每个分配的 block ,能够单独释放 block ,处理空闲 block 碎片和合并,有一些策略来选择从几个空闲 block 中分配哪个,等等。
对于通用分配器,这是必需的,但是池通过让调用者决定其中的一些行为来避免所有这些复杂性(以及相关的空间和运行时开销) 静态。
Apache 示例似乎只允许整个池释放(所以它就像一个 arena allocator )。这意味着它不需要跟踪单个分配记录、它们的生命周期和零散的免费存储。它只需要跟踪一个(或多个)大块内存,并更新指向下一个未使用空间的指针。请注意,即使这些大块是使用 malloc
分配的,此成本通常也会分摊到许多 池分配中。
其他池类型可能仅限于相同大小(或类型)的对象,这进一步简化了它们;他们甚至可以以接近于零的成本保留一个 LIFO 空闲列表,允许按记录重新分配。
关于c - 为什么 apr_palloc 比 malloc 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11968365/