【问题标题】:Do `-g -rdynamic` gcc flags slow down application execution (grow performance consumption) notably?`-g -rdynamic` gcc 标志是否会显着减慢应用程序的执行速度(增加性能消耗)?
【发布时间】:2014-01-07 19:22:09
【问题描述】:

所以我想用backtrace logging 分发我的gcc 应用程序以解决严重错误。然而它是对性能非常关键的应用程序,所以我想知道-g -rdynamic gcc 标志是否会减慢执行速度(特别是如果它们确实分配了)?还想为我的用户提供最佳性能,所以我使用 "-flto""-mtune" 之类的优化标志进行编译,这让我想知道标志是否会发生冲突并且内部 baacktrace 会很疯狂?

【问题讨论】:

  • 启用优化后,您的堆栈跟踪将不会是垃圾,但由于内联和其他一些优化,您可能无法在没有优化的情况下获取所有堆栈帧。
  • 如果你不知道(当你有你的代码,并且在你自己的机器上运行它时),是什么让你认为互联网上一群随机的人不知道你的代码是什么会知道吗?
  • @SteveJessop:通用gcc知识/Linux生产经验。
  • 在生产代码中保留调试符号不会降低性能,只会增加膨胀。我也发送了这样的代码,以便从客户那里获得有意义的错误报告。

标签: c++ c gcc release trace


【解决方案1】:

虽然引入调试符号本身不会影响性能,但您的应用程序在可能的性能方面仍然远远落后。我的意思是,一般来说,同时使用-g-O3 是个坏主意。因此,如果您的应用程序对性能至关重要,但同时又需要保持良好的调试水平,那么在这两者之间找到一些平衡点是合理的。在最新版本的 GCC 中,我们提供了-Og 标志:

优化调试体验。 -Og 启用优化 干扰调试。应该是优化级别 标准编辑-编译-调试周期的选择,提供了一个 合理的优化水平,同时保持快速编译 以及良好的调试体验。

我认为用这个标志测试你的应用程序是个好主意,看看性能是否确实优于裸-g,但调试保持不变。

再一次,不要忽视阅读 GCC 官方文档。 LTO 是 GCC 中相对较新的功能,因此,它的某些部分仍处于试验阶段,并不适合生产。例如,这是直接提取:

链接时优化不适用于调试生成 信息。将-flto-g 结合目前是实验性的,并且 预计会产生错误的结果。

不久前,我对 LTO 的体验参差不齐。有时它运行良好,有时项目甚至无法编译,更不用说还可能存在细微的运行时问题。总结一下,我不建议使用 LTO,尤其是在您的情况下。

注意: LTO 的性能增益通常在 0% 到 3% 之间变化,并且很大程度上取决于底层应用程序。如果没有分析,您将无法判断针对您的情况使用 LTO 是否合理,因为它可能带来的麻烦多于好处。

-march-mtune 这样的标志通常在非常低的级别上进行优化 - 指令级别 用于目标处理器架构。因此,我不希望它们干扰调试。不过,欢迎您使用自己的应用程序对此进行测试。

【讨论】:

  • 我认为这根本不能回答 OP 的问题。
  • @R.:OP 的目标:1) 为最终用户提供良好的性能; 2)保持合理的调试; 3)了解混合某些标志的陷阱。所有这些都在我的回答中得到了解决。
  • 好吧 OP 接受了它,所以我想我错了,它对 OP 没用。然而,问题中没有任何关于调试选项的内容。 OP 只是想要回溯,当然没有理由为此牺牲-O3。就我个人而言,我几乎从不出于调试目的关闭优化,但这样做是否有用在很大程度上取决于您使用的调试工具的类型以及您发现自己处理的错误类型。
【解决方案2】:

-g 对性能没有任何影响。 -rdynamic 将增加主可执行文件中动态符号表的大小,可能会减慢动态链接。我最好的猜测是,减速将非常小,但可能使用精确的测量/分析工具可以测量(非零)。

【讨论】:

    猜你喜欢
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    相关资源
    最近更新 更多