OSX 内存分配缓慢

Slow memory allocation in OSX

我试图找出我在 OSX 中遇到的内存分配问题。 如果我正常编译和 运行 下面的代码,它会 运行 相当快。

#include <sys/mman.h>
#define SIZE 8 * 1024 * 1024

int main(int argc, char const *argv[]) {
  for (int i = 0; i < 50000; ++i) {
    mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
  }
  return 0;
}

但是,如果我编译相同的代码但链接到某个库(即:clang -o test test.c -lpcre),它将随机 运行 快(30 毫秒)或非常慢(18 秒)。

请注意,我什至没有使用库,只是链接。我还注意到这似乎不会发生在任何库中。

我 运行宁 OSX 10.10.3。有什么想法吗?

如果您不需要初始化内存,使用 malloc() 会更有效,因为您对 mmap() 的使用不仅为您的进程分配了 8 MB 的内存,而且还对其进行了初始化.

在 OS X 上,malloc() 和 mmap() 都在内部使用 mmap() 系统调用(系统调用编号 197 - http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/kern/syscalls.master) , 它要求内核将虚拟内存映射到物理内存。

当然可以。这是一个想法。每个人和他的狗都通过调用 malloc 来分配内存。在 MacOS X 的历史上,从来没有人使用过 mmap 来分配内存。考虑到这一点,猜猜哪个功能已被优化到最大,而 MacOS X 的设计者对哪个功能一点都不关心速度。使用已优化的那个。

这只是内核中的一个错误,其他人也遇到过。内核中查找未使用的地址块 space 以分配的代码使用了低效的搜索算法。

我怀疑它似乎取决于你是否 link 一个库的原因是动态加载器 (dyld) 必须映射这样一个库,并且有时会将内核的 VM 内务处理数据置于这样的状态触发搜索效率低下。它不会在每个 运行 上发生的原因可能与地址 Space 布局随机化 (ASLR) 有关。

我鼓励您就此向 Apple 提交错误,特别是因为您有一个很好的简单测试用例。 (它可能会因为重复而被关闭,因为我相信你不会是第一个提交它的人。尽管如此,每一个新的错误报告都可以帮助隔离它并提高它在 Apple 中的优先级。)