问题

The Computer Language Benchmarks Game我们可以看到:

  • Go平均比C慢10倍
  • Go比Java快3倍!

考虑到Go编译器生成用于执行的本机代码,这怎么可能呢?
Go的不成熟的编译器?或者Go语言存在一些内在问题?

编辑:
大多数答案否认Go语言的内在缓慢,声称问题存在于不成熟的编译器中。
因此我做了一些自己的测试to calculate Fibonacci numbers:迭代算法在Go(freebsd,6g)中运行,其中same的速度与C中一样(带有O3选项)。沉闷的递归运行在Go2 timesslower中比在C中运行(使用-O3选项;使用-O0 - 相同)。但我没有看到基准游戏中的10倍跌幅。


#1 热门回答(96 赞)

6g和8g编译器没有特别优化,因此它们生成的代码不是特别快。

它们被设计为自己快速运行并生成可以正常运行的代码(有一些优化).gccgo使用GCC现有的优化过程,并且可能提供与C的更有意义的比较,但gccgo尚未完成功能。

基准数字几乎完全与实施质量有关。它们与语言本身并没有太大关系,除非实现花费运行时支持基准测试并不真正需要的语言功能。在大多数编译语言中,一个足够聪明的编译器理论上可以删除不需要的东西,但是有一个点你正在操纵演示,因为很少有真正的语言用户会编写没有使用该功能的程序。在不完全删除它们的情况下将事物移开(例如,在JIT编译的Java中预测虚拟调用目标)开始变得棘手。

FWIW,当我看看它时,我自己非常琐碎的测试(基本上是一个整数加法的循环),gccgo生成的代码在gcc -O0gcc -O2之间的范围的快速结束时等效C. Go本身并不慢,但是编译器不会做任何事情。对于一种10分钟的语言来说,这简直令人惊讶。


#2 热门回答(48 赞)

在下一版本的Go FAQ中,应出现类似于以下内容的内容。

性能为什么Go在基准X上表现不佳? Go的设计目标之一是在可比较的程序中实现C的性能,但在一些基准测试中,它的表现非常差,包括测试/工作台中的几个。最慢的依赖于在Go中没有可比性能版本的库。例如,pidigits依赖于多精度数学包,而C版本与Go不同,使用GMP(用优化的汇编程序编写)。依赖于正则表达式的基准(例如regex-dna)实际上是将Go的stopgap regexp包与成熟的,高度优化的正则表达式库(如PCRE)进行比较。通过广泛的调整赢得基准游戏,大多数基准测试的Go版本需要引起注意。如果你测量可比较的C和Go程序(反向补充是一个例子),你会发现两种语言的原始性能比这个套件所表明的要接近得多。不过,还有改进的余地。编译器很好但可能更好,许多库需要主要的性能工作,而垃圾收集器还不够快(即使它是,注意不要产生不必要的垃圾会产生巨大的影响)。

这里有一些来自最近的邮件列表主题的更多细节The Computer Benchmarks Game
Garbage collection and performance in gccgo (1)Garbage collection and performance in gccgo (2)
值得注意的是,计算机基准游戏只是一款游戏。具有性能测量和容量规划经验的人员会像现实和实际工作负载一样仔细匹配;他们不玩游戏。


#3 热门回答(30 赞)

我的回答并不像其他人那样技术性,但我认为它仍然具有相关性。当我决定开始学习Go时,我在计算机基准游戏中看到了相同的基准。但老实说,我认为所有这些综合基准测试对于决定Go是否足够快而言毫无意义。

我最近使用Tornado TornadIO ZMQ用Python编写了一个消息服务器,对于我的第一个Go项目,我决定用Go重写服务器。到目前为止,让服务器具有与Python版本相同的功能,我的测试向我展示了Go程序中4.7倍的速度提升。请注意,我只在Go中编写了一个星期的编码,而且我已经用Python编写了超过5年的编码。

Go只会在它们继续工作时变得更快,我认为它实际上归结为它在现实世界的应用程序中的表现,而不是微小的计算基准。对我来说,Go显然比我在Python中生成的程序更有效。这是我对这个问题的回答。


原文链接