c - 为什么 apr_palloc 比 malloc 快?

标签 c malloc apr

通读 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/

相关文章:

c++ - 从winapi c项目中的专用dll加载图像资源

C:链表正确使用malloc

基于 Tomcat APR 的 Apache Tomcat Native Library 错误

linux - Apache 模块中内存映射文件的过度同步

java - 将 APR 与 Tomcat 一起使用有什么好处(如果有)?

c - FFmpeg vaapi_transcode 示例执行错误

c - 动机的功能搜索给出了大写字母的错误

c - 合并两个数组并省略所有重复元素

c - 在用 malloc 创建的字符串中逐字符写入?

free() 上损坏的双链表