由编译的编译器执行编译的代码

时间:2012-01-23 13:08:47

标签: c performance gcc compilation

如果我希望从中获得更好的性能,例如,MySQLdb,我可以自己编译它,我将获得更好的性能,因为它不是在i386,i486或者只是在我的CPU上编译的。我还可以选择编译选项等等...... 现在,我想知道对于非常规软件(例如编译器)是否也是如此。 第一部分来了:

  • 编译像GCC这样的编译器会带来更好的性能吗? 第二部分:
  • 我自己编译的编译器编译的代码会更好吗?

(是的,我知道,我可以编译我的编译器并对其进行基准测试......但也许......有人已经知道了答案,并将与我们分享=)

5 个答案:

答案 0 :(得分:14)

在回答你的第一个问题时,几乎肯定是的。 gcc的二进制版本将是“最低公分母”,如果使用更适合您系统的特殊标记对它们进行编译,它很可能会更快。

关于你的第二个问题,不。

无论你如何优化它,编译器的输出都是一样的(当然,除非它有错误)。

换句话说,即使你在编译gcc时完全填满了你的编译器标志,你的gcc的特定编译版需要一周半的时间来编译“Hello World” ,实际的“Hello World”可执行文件应该与“最小公分母”gcc生成的可执行文件相同(如果使用相同的标记)。

答案 1 :(得分:5)

(1)有可能。如果您为编译器引入了一个新的优化,并使用此优化重新编译它 - 重新编译的代码可能会表现得更好。

(2)不!!!!编译器无法更改代码的逻辑!在您的情况下,代码的逻辑是最终生成的本机代码。因此,如果使用编译器A_2或B编译编译器A_1,则不会影响A_1生成的本机代码[在此处A_1,A_2是相同的编译器,索引只是为了清晰起见]。

答案 2 :(得分:3)

a.Well,你可以将编译器编译到你的系统,也许它运行得更快。喜欢任何节目。 (我认为通常它不值得,但做任何你想做的事。)

湾不。即使您在计算机中编译编译器,它的行为也不应该改变,因此它生成的代码也不会改变。

答案 3 :(得分:2)

  

编译像GCC这样的编译器会带来更好的性能吗?

专门针对其使用的目标平台编译的程序通常比为通用平台编译的程序执行得更好。为什么是这样?有关harware的知识可以帮助编译器将数据与高速缓存友好对齐,并选择与CPU流水线配合良好的指令排序。

通过利用SSE(各种版本)等特定指令集,可以实现最大的收益。

另一方面,你应该问自己,像GCC这样的程序是否真的受CPU限制(更有可能是IO限制),调整CPU性能可以带来任何可衡量的好处。

  

我自己编译的编译器编译的代码是否会表现更好

希望不是!允许编译器优化程序不应该改变它的行为。无论你如何编译你的GCC,它都应该将代码编译为与GCC的通用二进制分发相同的二进制文件。

如果编译到特定平台的代码比通用平台的代码编译更快,为什么我们都不发送代码而不是二进制代码?猜猜是什么,一些Linux发行版实际上遵循这个哲学,如Gentoo。当你在它的时候,确保构建静态链接的二进制文件,磁盘空间现在如此便宜,它至少可以提供0.001%的性能。

好吧,那有点讽刺。人们分发通用二进制文件的原因非常明显:它是geneirc,最低的共同点,它可以在任何地方使用。这在灵活性和用户友好性方面是一个很大的好处。我记得曾经为我的Gentoo盒子编译Gnome,花了一两天! (但它一定要快得多;-))

另一方面,有些时候您希望获得最佳性能,并且为特定的结构构建和优化是有意义的。

答案 4 :(得分:0)

从源代码构建时,GCC使用三步引导。基本上,它会三次编译源代码,以确保构建工具和编译器成功构建。该引导用于验证目的。但是,可以使用阶段1作为优化后期阶段的基准。您应该使用make profiledbootstrap构建GCC以使用此基于配置文件的优化。

这个基于配置文件的构建过程提高了" GCC"的性能,但没有提高用它编译的软件,正如其他答案所指出的那样。