为了分析(-pg),为什么我的代码在multithreading下比使用单线程运行速度慢?

我正在写一个射线追踪器。

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

在奇怪的一系列事件中,应用程序的debugging版本现在运行速度较慢,但​​优化后的版本运行速度比添加线程之前要快。

我将“-g -pg”标志传递给gcc用于debugging构build,并将优化构build的“-O3”标志传递给gcc。

主机系统:Ubuntu Linux 10.4 AMD64。

我知道debugging符号为程序增加了大量的开销,但相对的性能一直保持。 即更快的algorithm在debugging和优化构build中总是运行得更快。

任何想法,为什么我看到这种行为?

debugging版本是用“-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”不是怪怪性能差异的三angular洲,而是“-pg”开关。 “-pg”选项可能会添加某种locking机制来衡量线程性能。

由于“-pg”在线程应用程序中被破坏了,我只是删除它。

没有-pg标志,你会得到什么? 这不是调试符号(不影响代码生成),这是分析(这是)。

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

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

由于调试符号,您的应用程序不会运行得更慢,因为编译器所做的优化较少,所以运行速度较慢。

除了占用更多的磁盘空间之外,调试符号不是“开销”。 在最大优化(-O3)下编译的代码不应该添加调试符号。 当你不需要上述符号时,这是一个标志。

如果您需要调试符号,则以牺牲编译器优化为代价来获得它们。 但是,再次,这不是“开销”,它只是没有编译器优化。

配置文件代码是否插入仪表调用足够的功能来伤害你?
如果你在汇编语言级别单步调试,你会发现很快。