mmap和sbrk,性能比较

5

这两种调用平均哪个更快?我听说在分配较小的内存时,mmap 更快,但是我没有听到过它们之间的比较。如果有关于它们性能的任何信息都可以提供。


你知道它们做的事情相似但不同吗? - DarkDust
1
是的,我是。我只是想知道在可接受的情况下用另一个替换另一个是否会导致性能差异。 - Jesus Ramos
1
你的结果可能会有所不同。最好根据你关心的确切环境进行测量。 - bmargulies
1
注意:如果调用sbrk,您将有破坏大多数malloc实现的风险。这会产生后果。例如,常见的C库调用[如strdup()]可能会受到影响,因为它们使用malloc()。 - jim mcnamara
1
确实,你绝对不能在可能调用malloc的程序中使用sbrk(或更糟的是brk)。由于任何标准库函数都可能调用malloc,这意味着你不能使用标准库。 - R.. GitHub STOP HELPING ICE
我正在编写一个内存分配器,因此这不是问题,因为我的分配器将链接到malloc的位置。我只是担心性能问题,因为它将用于某些特定的内部使用。 - Jesus Ramos
1个回答

12

由于答案因实现而异,您应该使用特定的实现(如 linux )对其进行标记。就目前而言,我将假设Linux是最受欢迎的实现。

话虽如此,理论上来说brk更容易优化,在实践中,我的机器上运行速度大约快10%。以下是我得到的一些分配一个页面的时间:

  • brk :最小2550个周期,典型2650个周期
  • mmap :最小2700个周期,典型2800个周期

我记得听说过brk能够跳过锁定mmap信号量的操作,这可以解释差异。

注意:在调整我的测试以使代码保持在缓存中之前,我更新了这些时间,以进行虚拟调用。


有趣的是,对我来说mmap比sbrk运行得更快,但是使用sbrk可以保持内存连续。 - Jesus Ramos
1
也许你的系统的sbrk正在执行一些用户空间锁定或记账,甚至调用两次brk系统调用(一次获取旧的brk,再次设置新的brk...?)如果你正在实现malloc,我不会依赖于系统库的sbrk,而是自己进行brk系统调用。 - R.. GitHub STOP HELPING ICE
我最终使用mmap作为从系统中获取内存的主要方式,并在遇到MAP_FAILED时使用sbrk作为备用方案。我可能会尝试使用brk调用来查看其性能如何。 - Jesus Ramos

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