首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程结构的性能代价:丢失的优化和内存分配

线程结构的性能代价:丢失的优化和内存分配
EN

Stack Overflow用户
提问于 2015-07-03 19:09:42
回答 1查看 193关注 0票数 5

我们正在经历一种奇怪的现象,在某些内存密集型工作负载中,头文件的包含会导致5-10%的性能损失。

此头文件将线程池声明为全局变量。此线程池从未在应用程序中以任何身份使用(尚未)。也就是说,除了在程序启动时创建这个静态线程池之外,应用程序是完全单线程的。一旦删除标头,性能惩罚就会消失。

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

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

这发生在Linux 64位工作站上,GCC和clang都有。正在使用来自C++11的标准线程原语。

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

EN

回答 1

Stack Overflow用户

发布于 2015-08-08 09:17:16

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

这是一个合理的成本,并导致一个更容易理解的输出从程序,代价是奇怪的性能变化的单个线程的例子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31212943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档