我们正在经历一种奇怪的现象,在某些内存密集型工作负载中,头文件的包含会导致5-10%的性能损失。
此头文件将线程池声明为全局变量。此线程池从未在应用程序中以任何身份使用(尚未)。也就是说,除了在程序启动时创建这个静态线程池之外,应用程序是完全单线程的。一旦删除标头,性能惩罚就会消失。
从一些研究来看,由于某些编译器优化不再可能,多线程应用程序似乎会受到一定的性能损失。当以任何形式或容量实例化与线程相关的构造时,这种优化是否有可能被关闭?
或者,由于性能损失在执行许多内存分配时似乎是最明显的,那么在编译/链接阶段,编译器是否会意识到线程结构被实例化,从而切换到线程安全内存分配程序?
这发生在Linux 64位工作站上,GCC和clang都有。正在使用来自C++11的标准线程原语。
编辑I还应该提到,根据我们的测试,当使用tcmalloc分配器而不是默认分配器时,性能差异似乎消失了。
发布于 2015-08-08 09:17:16
多线程malloc和其他一些检查过的函数会导致锁开销,这与您所看到的是一致的。我希望malloc实现会通过线程头文件中的某个指令更改为线程(和锁定)版本。
这是一个合理的成本,并导致一个更容易理解的输出从程序,代价是奇怪的性能变化的单个线程的例子。
https://stackoverflow.com/questions/31212943
复制相似问题