使用-g 编译本身会降低性能吗?
Does compiling with -g, in itself, degrade performance?
(这是一个关于 gcc 和 clang 的问题,但可能适用于其他编译器。)
如果我编译我的 C 或 C++ 代码,并使用 -g
开关生成调试信息,这本身是否会以任何方式降低编译程序的性能...
- 最小优化(
-O0
)?
- 最大优化(
-O3
)?
注意: 我并不是说必须 parse/load 可执行文件的性能损失,由于额外的内容,可执行文件更大;我的意思是代码 运行.
如果您在调试器之外 运行 它不会对性能造成任何影响。调试符号用于帮助调试。两种情况下生成的代码应相同。
我认为没有任何性能差异。事实上,生成的代码将是相同的,并且根据文档 here,-g
可与 -O
一起使用。此外,调试符号没有写入代码,而是写入另一个名为 "debug section" 的部分,该部分甚至没有在 运行 时间加载(仅由调试器)
-g
不会更改 运行 的优化或生成的代码。
这是 here
规定的 gcc 政策
然而,注意同一文档指出的可能是有用的:
The shortcuts taken by optimized code may occasionally be surprising:
some variables you declared may not exist at all; flow of control may
briefly move where you did not expect it; some statements may not be
executed because they compute constant results or their values are
already at hand; some statements may execute in different places
because they have been moved out of loops. Nevertheless it is possible
to debug optimized output. This makes it reasonable to use the
optimizer for programs that might have bugs.
所以最终调试永远不会影响您的优化,但反之亦然,使用 -O3
可能会降低您的调试信息(例如通过删除无用的变量)。
请注意,在这种情况下使用 -Og
(如 here 所述)可能会更好,因为它将:
Optimize debugging experience. -Og enables optimizations that do not
interfere with debugging. It should be the optimization level of
choice for the standard edit-compile-debug cycle, offering a
reasonable level of optimization while maintaining fast compilation
and a good debugging experience.
但是这会影响性能,因为一些会干扰调试的优化过程不会完成。
编辑:
链接和引用回答了您关于 gcc
的问题。它可能不适用于其他编译器,例如 clang
。
但是,我也找到了 clang
的一些文档。
例如 here:
Basically, the debug information allows you to compile a program with
“-O0 -g” and get full debug information, allowing you to arbitrarily
modify the program as it executes from a debugger. Compiling a program
with “-O3 -g” gives you full debug information that is always
available and accurate for reading (e.g., you get accurate stack
traces despite tail call elimination and inlining), but you might lose
the ability to modify the program and call functions where were
optimized out of the program, or inlined away completely.
-g 标志将调试信息添加到二进制文件。这存在于 .text
CPU 运行 位的可执行文件的单独部分(.stab
和 .stabstr
)中。当 运行 在调试器之外时,操作系统加载程序不会加载调试部分。也可以使用 strip
实用程序轻松去除调试信息,以生成与不使用 -g 标志编译的二进制文件相同的二进制文件。
通常情况下,当你想调试的时候,你会在没有优化和 NDEBUG 预处理器宏的情况下编译。但是这些东西不受 -g 标志控制。
(这是一个关于 gcc 和 clang 的问题,但可能适用于其他编译器。)
如果我编译我的 C 或 C++ 代码,并使用 -g
开关生成调试信息,这本身是否会以任何方式降低编译程序的性能...
- 最小优化(
-O0
)? - 最大优化(
-O3
)?
注意: 我并不是说必须 parse/load 可执行文件的性能损失,由于额外的内容,可执行文件更大;我的意思是代码 运行.
如果您在调试器之外 运行 它不会对性能造成任何影响。调试符号用于帮助调试。两种情况下生成的代码应相同。
我认为没有任何性能差异。事实上,生成的代码将是相同的,并且根据文档 here,-g
可与 -O
一起使用。此外,调试符号没有写入代码,而是写入另一个名为 "debug section" 的部分,该部分甚至没有在 运行 时间加载(仅由调试器)
-g
不会更改 运行 的优化或生成的代码。
这是 here
然而,注意同一文档指出的可能是有用的:
The shortcuts taken by optimized code may occasionally be surprising: some variables you declared may not exist at all; flow of control may briefly move where you did not expect it; some statements may not be executed because they compute constant results or their values are already at hand; some statements may execute in different places because they have been moved out of loops. Nevertheless it is possible to debug optimized output. This makes it reasonable to use the optimizer for programs that might have bugs.
所以最终调试永远不会影响您的优化,但反之亦然,使用 -O3
可能会降低您的调试信息(例如通过删除无用的变量)。
请注意,在这种情况下使用 -Og
(如 here 所述)可能会更好,因为它将:
Optimize debugging experience. -Og enables optimizations that do not interfere with debugging. It should be the optimization level of choice for the standard edit-compile-debug cycle, offering a reasonable level of optimization while maintaining fast compilation and a good debugging experience.
但是这会影响性能,因为一些会干扰调试的优化过程不会完成。
编辑:
链接和引用回答了您关于 gcc
的问题。它可能不适用于其他编译器,例如 clang
。
但是,我也找到了 clang
的一些文档。
例如 here:
Basically, the debug information allows you to compile a program with “-O0 -g” and get full debug information, allowing you to arbitrarily modify the program as it executes from a debugger. Compiling a program with “-O3 -g” gives you full debug information that is always available and accurate for reading (e.g., you get accurate stack traces despite tail call elimination and inlining), but you might lose the ability to modify the program and call functions where were optimized out of the program, or inlined away completely.
-g 标志将调试信息添加到二进制文件。这存在于 .text
CPU 运行 位的可执行文件的单独部分(.stab
和 .stabstr
)中。当 运行 在调试器之外时,操作系统加载程序不会加载调试部分。也可以使用 strip
实用程序轻松去除调试信息,以生成与不使用 -g 标志编译的二进制文件相同的二进制文件。
通常情况下,当你想调试的时候,你会在没有优化和 NDEBUG 预处理器宏的情况下编译。但是这些东西不受 -g 标志控制。