c – 线程构造的性能成本:错过优化和内存分配

我们遇到一种奇怪的现象,其中包含头文件会导致某些内存分配密集型工作负载的性能下降5-10%.

此头文件将线程池声明为全局变量.此线程池从未在应用程序中的任何容量中使用.也就是说,除了在程序启动时创建这个静态线程池,应用程序完全是单线程的.删除标头后,性能损失将消失.

从一些研究来看,似乎多线程应用程序可能会因某些编译器优化不再可能而导致性能损失.每当与线程相关的构造以任何形式或容量实例化时,是否有可能关闭此类优化?

或者,由于在执行大量内存分配时性能损失似乎最明显,是否有可能在编译/链接阶段编译器意识到线程构造是实例化的,因此它切换到线程安全的内存分配器?

这种情况发生在Linux 64位工作站上,包括GCC和clang.正在使用来自C 11的标准线程基元.

编辑我也应该提一下,根据我们的测试,当使用tcmalloc分配器而不是默认分配器时,性能差异似乎消失了.

最佳答案
多线程malloc和其他一些检查功能会产生锁定成本,与您所看到的一致.我希望malloc实现通过线程头文件中的某个指令更改为线程(和锁定)版本.

这是一个合理的成本,并且可以从程序中获得更易理解的输出,代价是单线程示例的奇怪性能更改.

转载注明原文:c – 线程构造的性能成本:错过优化和内存分配 - 代码日志