【问题标题】:mmap vs sbrk, performance comparisonmmap vs sbrk,性能比较
【发布时间】:2011-07-27 22:02:53
【问题描述】:

平均而言,这些调用中哪个更快?我听说mmap 对于较小的分配更快,但我还没有听说过两者的比较。任何有关这些性能的信息都会很好。

【问题讨论】:

  • 你知道他们做着相似但不同的事情吗?
  • 是的,我愿意。我只是想知道在可接受的情况下替换另一个是否会导致性能差异。
  • 您的里程可能会有所不同。最好根据您关心的确切环境进行衡量。
  • 注意:如果您调用 sbrk,您将面临破坏大多数 malloc 实现的风险。这有后果。例如,常见的 C 库调用 [如 strdup()] 可能会受到影响,因为它们使用了 malloc()。
  • 确实,您绝对不能在可能调用malloc 的程序中使用sbrk(或更糟糕的是brk)。而且由于任何标准库函数都可以调用malloc,这意味着您不能使用标准库,句号。

标签: c linux memory-management mmap sbrk


【解决方案1】:

你应该用一个特定的实现来标记它(比如linux),因为答案肯定会因实现而异。现在我假设 Linux 是最受欢迎的。

话虽如此,brk 理论上更优化,实际上它在我的机器上运行速度快了大约 10%。分配一页,这些是我得到的时间:

  • brk:最少 2550 个循环,典型 2650 个循环
  • mmap:最少 2700 个循环,典型 2800 个循环

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

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

【讨论】:

  • 对我来说很奇怪,mmap 实际上比 sbrk 运行得更快,但再次使用 sbrk 可以保持内存连续。
  • 也许您系统的sbrk 正在执行一些用户空间锁定或记帐,甚至两次调用brk 系统调用。 (一次获取旧的brk 并再次设置新的...?)如果您正在实施malloc,我不会依赖系统库的sbrk,而是自己制作brk 系统调用。
  • 我最终使用 mmap 作为从系统中获取内存并使用 sbrk 作为备份的主要方式,以防出现 MAP_FAILED,我可能会尝试使用 brk 调用来查看它的性能会的。
猜你喜欢
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多