(这是关于gcc和clang的问题,但可能适用于其他编译器.)
如果我编译我的C或C++代码,并使用生成调试信息-g
开关,这是否本身降解以任何方式编译的程序的性能...(1)用最小优化(-O0
)?(2.)最大化优化(-O3
)?
注意:我并不是说必须解析/加载可执行文件的性能损失,由于额外的内容,这可能会更大; 我指的是运行的代码.
我正在写一个光线追踪器.
最近,我添加了线程到程序,以利用我的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
Run Code Online (Sandbox Code Playgroud)
这使我确信"-g3"不应该归咎于奇怪的性能增量,但它更像是"-pg"开关."-pg"选项可能会添加某种锁定机制来测量线程性能.
因为无论如何"-pg"在线程应用程序上被破坏了,我只是删除它.
我正在运行使用调试符号编译的 Rust 实用程序。
cargo build
# without the "--release" flag
Run Code Online (Sandbox Code Playgroud)
与用 C 编写的相同实用程序相比,这些确实很慢。
调试符号是否可能影响性能?