使用 jemalloc vs malloc vs calloc 和其他常见替代品的优缺点是什么?

What are the advantages and disadvantage of using jemalloc vs malloc vs calloc and other common alternatives?

提问人:Greg 提问时间:9/16/2017 更新时间:3/23/2019 访问量:2583

问:

今天阅读 Rust subreddit 时,我看到了以下评论:

Jemalloc 针对(多线程)速度进行了优化,而不是针对内存使用进行了优化

在做了更多的研究之后,我发现还有更多的替代品(例如calloc)。

我想了解不同内存分配器的优缺点是什么?

如果这个问题看起来很傻,我的背景主要是解释型语言(它们没有暴露这种细粒度的记忆控制)。

malloc dynamic-memory-allocation realloc calloc jemalloc

评论


答:

0赞 Ameen 3/23/2019 #1

malloccallocrealloc

这些函数不是不同的分配器。它们是向同一分配器请求内存的不同方式。

  • malloc在不初始化内存的情况下提供内存(填充了前一个用户存储在其中的任何内容)。

  • calloc相同,但它也会初始化内存(用零字节填充它)。malloc0x00

  • realloc获取已分配的内存,并允许用户调整其大小。

因此,在分配器及其不同实现的上下文中,并且不会单独列出,因为每个分配器实现都需要这些函数的自己的版本malloccallocrealloc

jemalloc, , ...ptmalloc

当有人想要实现不同的分配器时,他不能(可以但默认情况下不应该)命名它,因为它会与 C 标准库的分配器发生冲突。相反,他们通常会给它一个不同的前缀,如 jemalloc、ptmalloc、nedmalloc、tcmalloc malloc

值得一提的是,C 标准库本身也有多个实现,每个实现都会以不同的方式实现其分配器。因此,根据编译代码时使用的标准库,将有不同的实现。例如:GNU C 标准库、MSVC 标准库等。malloc

不同的分配器之间有什么区别?

要了解每种实现的确切优点和缺点,必须阅读每个实现的作者/作者编写的文档(如果存在),阅读代码以了解算法或阅读专家撰写的关于该特定实现的文章/研究论文。

但是,如果我要对这些实现之间的差异进行分类,我将列出以下内容:

  1. 一些实现专注于某些使用模式,并尝试针对它们进行优化,甚至以降低其他情况的效率为代价。例如,他们专注于优化来自多个线程的分配,以使其更快,但代价是使用更多内存。这些类型的分配器通常是在对特定案例进行仔细调查后部署的,这些案例表明它将从这种权衡中受益。jemalloc
  2. 一些实现对分配器的使用施加了一定的限制,以使其更快。例如,单线程分配器将消除对同步对象的需求,使其更快。
  3. 其他实现尝试尽可能通用,并且不偏袒任何情况。此类别包括标准库中包含的默认分配器。

评论

2赞 akostadinov 9/7/2022
不一定使用更多内存。我对我的 ruby 应用程序的测试比标准更快,使用的内存更少。jemallocjemallocmalloc