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

4

今天我在阅读Rust subreddit时看到了这样的评论:

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

经过更多的研究,我发现还有更多的替代品(例如calloc)。

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

如果这个问题看起来很愚蠢,那是因为我的背景主要是解释性语言(这些语言不会暴露出这样细粒度的内存控制)。

1个回答

0

malloccallocrealloc

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

  • malloc提供未初始化的内存(填充为先前用户存储在其中的任何内容)。

  • callocmalloc相同,但它还会初始化内存(用零字节0x00填充)。

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

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

jemallocptmalloc、……

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

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

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

要了解每种实现的确切优缺点,必须阅读作者/每个实现的作者编写的文档(如果存在),阅读代码以了解算法或阅读专家撰写的有关该特定实现的文章/研究论文。
但是,如果要对这些实现之间的差异进行分类,我会列出以下内容:
  1. 一些实现侧重于某些使用模式,并尝试为它们进行优化,即使以降低其他情况的效率为代价。例如,jemalloc就是一个例子,它专注于优化从多个线程分配以使其更快,但以使用更多内存为代价。这些类型的分配器通常在仔细调查显示它将从这种权衡中受益的特定情况下部署。
  2. 一些实现对分配器的使用设置了某些限制,以使其更快。单线程分配器就是一个例子,它将消除同步对象的需求以使其更快。
  3. 其他实现尽可能通用,不偏爱任何一种情况。此类别包括标准库中包含的默认分配器。

1
并不是一定要使用jemalloc来占用更多的内存。我测试了我的Ruby应用程序,使用jemalloc比标准的malloc更快,并且使用的内存更少。 - akostadinov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接