从源代码构建编译器是否会带来更好的优化



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

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

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

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

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

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

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

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

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

也就是说,即使是同一个汇编程序也可能在您和他们的机器上执行不同的操作,例如,因为一个是针对AMD优化的,另一个是为英特尔优化的。

在我看来,从理论上讲,编译速度可以更快,因为你可以对"编译编译器的编译器"说,"请针对我的计算机,你可以使用我的计算机处理器自己的机器代码来优化"。

但我认为编译器的优化再快不过了。。为了使编译器的优化更快,我认为我们需要在编译器中加入一些类似新技术的东西,而不仅仅是重新编译。

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

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

因此,有了所有这些if,当您在平台上重新编译编译器时,您的程序不太可能更快。然而,如果根据您的平台而不是通用二进制进行优化,编译器可能会更快,从而缩短编译时间。

最新更新