【问题标题】:If code compiled with -g0 is faster than -g3?如果用-g0 编译的代码比-g3 快?
【发布时间】:2015-06-04 14:36:29
【问题描述】:

我只是为自己使用我的程序。 我是否应该总是使用 -g3 (Debug max) 编译它,因为有时我需要调试它?

如果使用 -g0(无调试)与 -g3(最大调试)相比,我的程序执行得更快?

【问题讨论】:

  • 我是否应该总是用 -g3(最大调试)编译它,因为有时我需要调试它?只有你可以决定。使用调试信息(在任何级别)进行编译通常会增加二进制大小,这可能会导致加载时间更长。如果没问题,那么您可以随时使用它。

标签: performance gcc compiler-optimization debug-symbols


【解决方案1】:

关于-gLEVEL(来自gcc manual):

请求调试信息并且还使用级别来指定多少信息。 默认级别为 2

Level 0 根本不产生任何调试信息。因此,-g0 否定 -g。

级别 1 产生的信息最少,足以在您不打算调试的程序部分中进行回溯。这包括函数和外部变量的描述,以及行号表,但没有关于局部变量的信息。

级别 3 包括额外信息,例如程序中存在的所有宏定义。当你使用 -g3 时,一些调试器支持宏扩展。

所以-g0-g3 之间的区别在于,级别 0 时您不会获得调试符号,级别 3 时您会获得很多符号。

无论如何,调试符号位于与代码/数据部分完全不同的部分。你可以通过objdump查看(也可以阅读How do debug symbols affect performance of a Linux executable compiled by GCC?)。

严格来说,-g0 不应该获得更快的程序,但带有许多调试符号的程序加载时间可能会更长。

有趣的是,对于 GCC,调试符号 (-g) 的存在和优化级别(例如 -O2)是正交的,您可以使用 -g -O2 而不会丢失编译器优化(您只会得到不太有用的调试信息,因为优化后的代码与原始源代码不太相似)。

我还会考虑 -Og 优化级别(在 GCC 4.8 中引入):

引入了新的通用优化级别-Og。它 满足快速编译和出色调试的需求 经验,同时提供合理水平的运行时性能。 开发的整体体验应该比默认好 优化级别-O0.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    相关资源
    最近更新 更多