5

我有一个 C++ 程序,它在 OSX 10.8.2 上比在 Linux 上慢得多。分析表明,原因是对 free 的调用(由 STL 操作,FWIW 产生)在 OSX 上要慢得多,因为它们会调用 madvise,并且在那里消耗实时。

有没有办法调节 OS/X 的这种行为?

4

1 回答 1

2

嗯,是!

我在 Linux 中使用 malloc/free 时遇到了可怕的性能问题,并开始寻找替代品。想到了两个选项tbbmalloc(英特尔 TBB 的一部分,是免费的顺便说一句)和 Google malloc。经过广泛的测试,尚不清楚哪个更快(两者中的),但两者都比 LIBC 的实施快得多。

我选择了 tbbmalloc,因为它工作更顺畅,google malloc 有一个错误导致虚拟内存非常大(保留但未提交),这对我的应用程序非常不利(IT 守护进程会杀死它)。

好的:

  • 比 libc 的 malloc 性能好得多。在 STL 重应用程序中是 3x-300x。
  • 简单的集成。没有代码更改。添加/更改 1 行可执行文件的生成文件。SO 没有变化。

坏处:

  • 内存检查器不会替换。对于 memchk/valgrind/等。恢复到原来的malloc。
  • 应用程序会多占用 10-30% 的内存。

我开发的应用程序是一个 CAD 应用程序,它使用了 10 多个 GB,构建和破坏了数以百万计的各种结构(大量 STL 映射、向量、hash_maps)。

这个怎么做:

在链接器命令中,添加-ltbbmalloc并确保库位于 lib 搜索路径(-L标志)中。

于 2013-12-11T08:24:39.540 回答