从 GCC 获取优化的源代码
Posted
技术标签:
【中文标题】从 GCC 获取优化的源代码【英文标题】:Get optimized source code from GCC 【发布时间】:2011-12-19 07:59:31 【问题描述】:我的任务是创建优化的 C++ 源代码并将其提供给朋友进行编译。也就是说,我不控制最终的编译,我只写C++程序的源代码。
我知道,a 可以在编译期间使用 GCC 的 -O1(以及 -O2 和其他)选项进行优化。但是我怎样才能得到这个优化的源代码而不是编译的程序呢?朋友编译器的参数我无法配置,所以我需要自己做一个好的源码。
【问题讨论】:
虽然您可以编写“优化”的源代码,但要考虑诸如缓存和微调算法之类的事情(数学背景可能会有所帮助),如果您无法运行分析,则很难编写最佳代码在目标系统上找到您的瓶颈。 【参考方案1】:GCC 执行的优化是低级的,这意味着您不会再次获得 C++ 代码,而是最好的情况下获得汇编代码。但是您将无法转换它或其他东西。
总而言之:优化源代码在代码级别,而不是对象级别。
【讨论】:
【参考方案2】:您可以要求 GCC 以各种方式转储其内部(Gimple,...)representations “阶段”。 GCC的中端是由数百个pass组成的,你可以让GCC转储它们,arguments like -fdump-tree-all
or -fdump-gimple-all
;请注意,一次编译可以获得数百个转储文件!
但是,GCC 的内部表示是相当低级的,你不应该期望不阅读大量材料就能理解它们。
我提到的转储选项对于那些在 GCC 中工作的人来说非常有用,或者通过用 C 编码的 plugins 或用 MELT 编码的 extensions 来扩展它(高级域特定语言来扩展 GCC)。我不确定它们对您的朋友是否有用。但是,它们可以帮助您了解优化过程会进行很多复杂的处理。
别忘了过早的优化是邪恶的:你应该首先让你的程序正确运行,然后对它进行基准测试和分析,最后优化你努力的几个部分。在将它们交给朋友之前,如果不亲自测试和运行它们,您可能无法编写正确且高效的程序。
【讨论】:
【参考方案3】:简单 - 选择可能的最佳算法,让优化器处理其余的。
优化源代码与优化二进制文件不同。 您优化源代码,编译器会优化二进制。
除了算法选择之外,您还需要进行一些分析。当然,有些做法可以加快代码速度,但有些做法会降低代码的可读性。仅在必要时和测量后进行优化。
【讨论】:
这更像是“你应该尝试优化算法,编译器会尝试优化二进制"以上是关于从 GCC 获取优化的源代码的主要内容,如果未能解决你的问题,请参考以下文章