我们遇到一种奇怪的现象,即在某些内存分配密集型工作负载中包含头文件会导致5-10%的性能损失。
此头文件将线程池声明为全局变量。此线程池从未在应用程序中的任何容量中使用。也就是说,除了在程序启动时创建这个静态线程池,应用程序完全是单线程的。一旦删除标题,性能损失就会消失。
从一些研究来看,似乎多线程应用程序可能会因某些编译器优化不再可能而导致性能损失。每当与线程相关的构造以任何形式或容量实例化时,是否可能关闭此类优化?
或者,由于在执行大量内存分配时性能损失似乎最明显,是否有可能在编译/链接阶段编译器意识到线程构造是实例化的,因此它切换到线程安全的内存分配器?
这发生在Linux 64位工作站上,包括GCC和clang。正在使用C ++ 11中的标准线程原语。
编辑我还应该提一下,根据我们的测试,当使用tcmalloc分配器而不是默认分配器时,性能差异似乎消失了。
答案 0 :(得分:0)
多线程malloc和其他一些已检查的功能会产生锁定成本,与您所看到的一致。我希望malloc实现可以通过线程头文件中的某个指令更改为线程(和锁定)版本。
这是一个合理的成本,并且可以从程序中获得更易理解的输出,代价是单线程示例的奇怪性能更改。