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



我们遇到了一个奇怪的现象,在某些内存分配密集型工作负载中,包含头文件会导致5-10%的性能损失。

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

从一点研究来看,由于某些编译器优化不再可能,多线程应用程序可能会导致一些性能损失。当以任何形式或容量实例化与线程相关的构造时,这种优化是否可能被关闭?

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

这种情况发生在同时具有GCC和clang的Linux 64位工作站上。正在使用C++11中的标准线程原语。

EDIT我可能还应该提到,根据我们的测试,当使用tcmalloc分配器而不是默认分配器时,性能差异似乎消失了。

多线程malloc和其他一些已检查的函数会产生锁开销,这与您所看到的一致。我希望malloc实现通过线程头文件中的某个指令更改为线程(和锁定(版本。

这是一个合理的成本,并以单线程示例的奇怪性能变化为代价,从程序中获得更易于理解的输出。

最新更新