【问题标题】:gcc -O0 vs. -Og compilation timegcc -O0 与 -Og 编译时间
【发布时间】:2013-03-11 12:06:23
【问题描述】:

gcc 的发行说明在 -Og 上有点含糊:

它满足了对快速编译和卓越调试体验的需求,同时提供了合理水平的运行时性能。开发的整体体验应该优于默认优化级别-O0。

“总体开发经验”是否包括编译时间?如果我不需要调试符号并且正在优化编译时间,我应该使用 -O0 还是 -Og?

【问题讨论】:

  • 如果你不需要调试符号你应该使用-O0
  • 为什么不用不同选项的你的编译器你的项目的完整构建进行计时,然后选择最快的那个?
  • 如果你只对良好的性能感兴趣,正常水平是O2。 O0 几乎没有优化,它主要用于调试(例如,它不会优化未使用的变量,它不会改进容易修复的草率编码等)。
  • @teppic 谢谢 - 我的程序运行时间很短,所以我现在正在优化编译时间。
  • 有一点要记住,-O0,通常等同于“调试”,没有优化也没有符号。因此,诸如签名溢出之类的事情不会发出警告,它可以在启用正确警告的情况下产生警告。 -Og 有点像-O,但在0.5 - 不完全是0,也不完全是1-Og 也会产生一些符号。我知道它不提供符号定义,通常可以在 -g3 获得。

标签: c++ debugging gcc optimization


【解决方案1】:

“总体开发经验”是否包括编译时间?

我认为确实如此,但不是在这个非常具体的情况下。

如果我不需要调试符号并且正在优化编译时间,我应该使用 -O0 还是 -Og?

-O0.

【讨论】:

    【解决方案2】:

    如果我不需要调试符号并且正在优化编译时间,我应该使用 -O0 还是 -Og?

    如果调试符号的存在与否无关紧要,请为这两个选项计时,看看哪个更快。

    【讨论】:

      【解决方案3】:

      使用-Og,编译器必须构造和写出额外的数据(用于调试),因此需要更长的时间。只需编译到汇编器(使用gcc -S -Og 等)并进行比较。但是,无论-O0-Og 运行时之间有什么区别,在启动gcc 及其完整机制的时候都可能相形见绌。

      如果您想要编译时间,也许您应该考虑使用 C 的 tcc。也许 C++ 的 LLVM 更快。

      【讨论】:

      • 您是否有证据支持您的第一个主张,“使用 -Og,编译器必须构造和写出额外数据(用于调试)”?如果我没记错的话,这只适用于-g 标志。查看 GCC 4.9.2 源代码 (gcc/opts.c) 显示 -Og-O1 (/* -Og selects optimization level 1. */) 相同,但禁用了一些标志,这些标志将通过 -O1 或更高版本启用 ( OPT_LEVELS_1_PLUS_NOT_DEBUGOPT_LEVELS_1_PLUS_SPEED_ONLYOPT_LEVELS_2_PLUS_SPEED_ONLY)。
      • 我在这里发布了一个更广泛的答案:stackoverflow.com/a/27076307/427545
      猜你喜欢
      • 1970-01-01
      • 2011-09-17
      • 2011-11-17
      • 1970-01-01
      • 2012-06-13
      • 2011-01-26
      • 1970-01-01
      • 2020-09-24
      • 2012-07-05
      相关资源
      最近更新 更多