从源构建编译器是否会导致更好的优化?

时间:2014-02-24 12:12:20

标签: c++ optimization compiler-construction

考虑这个简单的案例场景:

我为我的通用操作系统(不是Windows)下载了C ++编译器(比如CLangGCC或其他任何东西)的预构建二进制文件。我编译了我的代码,其中包含一些计算成本高的数学计算和优化标记-O3,我的执行时间为T1

在另一次尝试中,这次不是使用预先构建的二进制文件,而是下载源代码并在我的通用机器上自己构建编译器。我使用相同的优化标志编译相同的代码,实现执行时间T2

T2 < T1或它们会或多或少相同吗?

换句话说,执行时间是否独立于编译器的构建方式?

4 个答案:

答案 0 :(得分:7)

编译器对代码的优化是编译器的行为的结果,而不是编译器的性能

只要编译器具有相同的行为设计,它就会产生完全相同的输出。

答案 1 :(得分:2)

通常,相同的编译器版本应该在给定相同的C或C ++代码输入的情况下生成相同的汇编代码。但是,某些事情可能会进一步影响运行编译器时正在执行的代码。

  • 发行版可能已从其他版本向后移植(甚至创建了自己的)补丁。
  • 现代编译器通常具有库依赖性(例如cloog),它们在不同版本中可能具有不同的行为,导致编译器基于其他数据做出代码生成决策
  • 这些库(在某些编译器版本中)可能在编译时是可选的(可能需要提供--enable开关来配置,或配置尝试自动检测它们。)
  • -march=native这样的编译器开关将查看您编译的硬件并尝试相应地进行优化。
  • 编译器优化器触发器的时间限制,实质上是对更好的机器进行更好的优化;或者记忆中的内容(我不认为现在可以在现代编译器中找到它们了)

尽管如此,即使是相同的汇编程序也可能在您的机器和机器上执行不同的操作,例如:因为一个针对AMD进行了优化,另一个针对英特尔进行了优化。

答案 2 :(得分:1)

在我看来,理论上,编译速度可以更快,因为你可以说“编译器编译编译器”,“请定位到我的电脑,你可以使用我的电脑的处理器自己的机器代码来优化”

但我认为编译器的优化不能更快。为了使编译器的优化速度更快,我认为我们需要将类似新技术的东西放入编译器中,而不仅仅是重新编译。

答案 3 :(得分:1)

这取决于编译器的实现方式和平台,但答案很可能是“不”。

如果您的平台提供了可以提高程序性能的特定功能,编译器中的优化器可能会使用该功能来生成更快的程序。只有在编译器编写器知道该功能并且已在优化器中对您的平台实施特殊处理时,优化器才能这样做。 如果就是这种情况,可以在优化器中动态完成检测,这意味着优化器的任何构建都可以检测平台并优化代码。由于某种原因,只有 if 检测必须在优化器的编译时发生,在您的平台上重新编译它可能会带来这种优势。但如果存在这样一个更好的plaform构建,编译器供应商很可能已经为它提供了二进制文件。

因此,对于所有这些ifs,当您在平台上重新编译编译器时,您的程序不太可能更快。但是,如果编译器针对您的平台而不是通用二进制文件进行优化,则编译器可能会更快一些,从而缩短编译时间。