首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的代码在编译用于性能分析(-pg)时,在多线程的情况下比在单线程的情况下运行得慢?

为什么我的代码在编译用于性能分析(-pg)时,在多线程的情况下比在单线程的情况下运行得慢?
EN

Stack Overflow用户
提问于 2010-05-21 14:33:29
回答 4查看 3.7K关注 0票数 2

我在写一个光线追踪器。

最近,我在程序中添加了线程,以利用我的i5四核上的额外内核。

奇怪的是,应用程序的调试版本现在运行速度变慢了,但优化后的构建比我添加线程之前运行得更快。

对于调试版本,我将"-g -pg“标志传递给gcc,对于优化版本,我将传递"-O3”标志。

主机系统: Ubuntu Linux 10.4 AMD64。

我知道调试符号会给程序增加很大的开销,但相对的性能始终保持不变。也就是说,在调试和优化构建中,更快的算法总是运行得更快。

你知道为什么我会看到这种行为吗?

调试版本是用"-g3 -pg“编译的。带有"-O3“的优化版本。

代码语言:javascript
复制
Optimized no threading:        0m4.864s
Optimized threading:           0m2.075s

Debug no threading:            0m30.351s
Debug threading:               0m39.860s
Debug threading after "strip": 0m39.767s

Debug no threading (no-pg):    0m10.428s
Debug threading (no-pg):       0m4.045s

这让我确信,不是"-g3“造成了奇怪的性能增量,而是"-pg”开关。"-pg“选项很可能添加了某种锁定机制来测量线程性能。

因为"-pg“在线程化的应用程序中被破坏了,所以我就把它去掉。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-05-21 22:46:01

如果不使用-pg标志,会得到什么?这不是调试符号(不会影响代码生成),而是分析(会影响代码生成)。

多线程进程中的性能分析需要额外的锁定,这会降低多线程版本的速度,甚至比非多线程版本慢。

票数 8
EN

Stack Overflow用户

发布于 2010-05-21 17:09:22

你在这里谈论的是两件不同的事情。调试符号和编译器优化。如果使用编译器必须提供的最强优化设置,则这样做的后果是丢失了对调试有用的符号。

你的应用程序不会因为调试符号而变慢,它的运行变慢是因为编译器所做的优化较少。

除占用更多磁盘空间之外,调试符号并不是“开销”。以最大优化(-O3)编译的代码不应添加调试符号。这是一个标志,当你不需要这些符号时,你可以设置它。

如果你需要调试符号,你需要以失去编译器优化为代价来获得它们。然而,再说一次,这不是“开销”,它只是缺少编译器优化。

票数 2
EN

Stack Overflow用户

发布于 2010-05-21 23:40:42

在足够多的函数中插入插装调用的配置文件代码是否足以伤害您?

如果你在汇编语言级别上单步操作,你很快就会发现。

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

https://stackoverflow.com/questions/2880025

复制
相关文章

相似问题

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