为什么apr_palloc比malloc更快?

mal*_*ree 1 c malloc apr

阅读Apache模块书,我在3.4.3部分中遇到了这个主张:

"第二个好处是在大多数平台上池分配比malloc更快!"

我意识到一个悬而未决的问题,但是......好吧,为什么?

Use*_*ess 5

除了Lars关于地点的观点之外,池分配只是一种不同的速度/灵活性权衡malloc.

malloc 必须跟踪每个已分配的块,能够单独释放块,处理空闲块碎片和合并,有一些策略可以选择分配哪些空闲块,等等.

这是通用分配器所必需的,但是通过使调用者静态地决定某些此行为,池可以避免所有这些复杂性(以及相关的空间和运行时开销).

Apache示例似乎只允许全池解除分配(因此它就像竞技场分配器).这意味着它不需要跟踪单个分配记录,它们的生命周期以及零碎的免费商店.它只需要跟踪一个(或多个)大块内存,并更新指向下一个未使用空间的指针.请注意,即使使用这些大块分配malloc,此成本通常会在许多池分配中分摊.

其他池类型可能仅限于相同大小(或类型)的对象,这进一步简化了它们; 他们甚至可以保持LIFO免费清单接近零成本,允许每记录重新分配.