2014-02-24 38 views
2

考虑一个简单的情况:从源代码构建编译器会导致更好的优化吗?

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

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

请问T2 < T1或者他们会差不多呢?

换句话说,执行时间与编译器的编译方式无关吗?你的代码的

+2

您是否怀疑预构建的二进制文件是以这种方式构建的,而忽略了它可能做的某些优化?如果是这样,为什么? – geoffspear

+1

我只希望编译时间改变。 – Nobody

+0

@正确!我正在使用GCC,其他实验室的同事都是CLANG的用户。然而,我们所做的本质上是相似的,并不完全相同。他们告诉他们在叮当时有更好的结果,但是,当我切换到叮当时,我意识到我的GCC还是更好。当问他们时,他们都表示他们已经编译了叮当,而我使用了预制。我只是想知道这是否相关。 – Pouya

回答

7

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

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

+1

更进一步,如果所有的编译设置和环境都是相同的,那么不仅编译器的输出是相同的,所产生的编译器二进制文件也会与预先构建的完全相同(也许除时间戳之外,如果有的话)。 – Excelcius

+0

这不是攻击,我只是想在接受答案之前澄清一切。你所说的是从机器(编译器构建)获取的编译器的* no *属性可能会影响执行时间。这个陈述是真实的吗? – Pouya

+0

这在理论上是可能的,但超级不太可能。根据我所能说的,我会说你的区别仅仅是因为你在不同的机器上进行测试。 – tenfour

1

在我看来,理论上编译速度可以更快,因为你可以说“编译器编译编译器”,“请将目标指向我的电脑,并且你可以使用我的电脑处理器自己的机器代码来优化”。

但我认为编译器的优化不能更快..为了让编译器的优化更快,我认为我们需要把诸如新技术的东西放进编译器,而不仅仅是重新编译。

1

这取决于如何实现该编译器,并在您的平台上,但答案很可能是“不”。

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

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

2

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

  • 发行版可能会从其他版本向后移植(甚至创建自己的)修补程序。
  • 现代编译器经常有图书馆depenencies(如cloog),可能有不同的版本不同的行为,从而使编译器进行代码生成的决策依据实质上其他数据
  • 这些库可以(在某些版本的编译器)是在可选编译时间(可能需要给予 - 启用交换机配置,或配置尝试自动检测它们)。
  • -march=native这样的编译器开关将查看您编译的硬件并尝试相应地进行优化。
  • 编译器优化器触发器的时间限制,基本上可以更好地优化更好的机器;或者对于内存来说是相同的(虽然我认为这不再是在现代编译器中可以找到的)

也就是说,即使是相同的汇编程序也可能在您的机器和它们的机器上执行不同的操作。因为一个针对AMD进行了优化,另一个针对intel。