我在写一个光线追踪器。
最近,我在程序中添加了线程,以利用我的i5四核上的额外内核。
奇怪的是,应用程序的调试版本现在运行速度变慢了,但优化后的构建比我添加线程之前运行得更快。
对于调试版本,我将"-g -pg“标志传递给gcc,对于优化版本,我将传递"-O3”标志。
主机系统: Ubuntu Linux 10.4 AMD64。
我知道调试符号会给程序增加很大的开销,但相对的性能始终保持不变。也就是说,在调试和优化构建中,更快的算法总是运行得更快。
你知道为什么我会看到这种行为吗?
调试版本是用"-g3 -pg“编译的。带有"-O3“的优化版本。
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“在线程化的应用程序中被破坏了,所以我就把它去掉。
发布于 2010-05-21 22:46:01
如果不使用-pg标志,会得到什么?这不是调试符号(不会影响代码生成),而是分析(会影响代码生成)。
多线程进程中的性能分析需要额外的锁定,这会降低多线程版本的速度,甚至比非多线程版本慢。
发布于 2010-05-21 17:09:22
你在这里谈论的是两件不同的事情。调试符号和编译器优化。如果使用编译器必须提供的最强优化设置,则这样做的后果是丢失了对调试有用的符号。
你的应用程序不会因为调试符号而变慢,它的运行变慢是因为编译器所做的优化较少。
除占用更多磁盘空间之外,调试符号并不是“开销”。以最大优化(-O3)编译的代码不应添加调试符号。这是一个标志,当你不需要这些符号时,你可以设置它。
如果你需要调试符号,你需要以失去编译器优化为代价来获得它们。然而,再说一次,这不是“开销”,它只是缺少编译器优化。
发布于 2010-05-21 23:40:42
在足够多的函数中插入插装调用的配置文件代码是否足以伤害您?
如果你在汇编语言级别上单步操作,你很快就会发现。
https://stackoverflow.com/questions/2880025
复制相似问题