线程结构的性能成本:错过优化和内存分配
Performance cost of threading constructs: missed optimisations and memory allocation
我们遇到了一个奇怪的现象,在某些内存分配密集型工作负载中,包含头文件会导致5-10%的性能损失。
此头文件将线程池声明为全局变量。这个线程池从未在应用程序中以任何容量使用过。也就是说,除了在程序启动时创建这个静态线程池之外,应用程序完全是单线程的。移除收割台后,性能损失将消失。
从一点研究来看,由于某些编译器优化不再可能,多线程应用程序可能会导致一些性能损失。当以任何形式或容量实例化与线程相关的构造时,这种优化是否可能被关闭?
或者,由于在执行大量内存分配时性能损失似乎最为明显,那么在编译/链接阶段,编译器是否可能意识到线程结构是实例化的,从而切换到线程安全的内存分配器?
这种情况发生在同时具有GCC和clang的Linux 64位工作站上。正在使用C++11中的标准线程原语。
EDIT我可能还应该提到,根据我们的测试,当使用tcmalloc分配器而不是默认分配器时,性能差异似乎消失了。
多线程malloc和其他一些已检查的函数会产生锁开销,这与您所看到的一致。我希望malloc实现通过线程头文件中的某个指令更改为线程(和锁定(版本。
这是一个合理的成本,并以单线程示例的奇怪性能变化为代价,从程序中获得更易于理解的输出。
相关文章:
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- C++二和.优化内存使用
- 如何控制或优化或删除或释放 UNION 中未使用的内存
- 如果 RMW 操作没有任何变化,是否可以针对所有内存顺序对其进行优化
- std::stable_sort: 如何选择内存优化算法而不是时间优化算法?
- 字符串编码用于内存优化
- 编译器内存优化 - 重用现有块
- 编译器是否优化析构函数中的内存集
- 矢量函数的C 内存优化
- 如何在CPU和内存中优化C 中的重型地图插入
- C++对间接运算符的标准描述是否保证内存写入不会被优化掉
- 内存分配,用于在C 11中循环中函数的返回值:如何优化
- 编译器优化了内存分配
- C++字符串内存重用优化
- 优化地形渲染的内存
- 内存对齐优化不仅性能,而且内存大小
- 优化数据结构,使其充分利用虚拟内存
- 有没有一种更快的方法或优化我可以应用到我的即兴内存池
- 优化内存读取和写入的长期运行
- 优化内存和性能的传输数据缓冲区