为什么Go这么慢(与Java相比)?

我们可以从2010年的计算机语言基准游戏中看到:

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

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

编辑:
大多数答案否定了Go语言固有的缓慢性,声称问题在于不成熟的编译器。
所以我自己做了一些测试来计算斐波那契数:迭代算法在Go(freebsd,6g)中运行,速度和C(O3选项)相同。单调的递归函数在Go中的运行速度比在C中慢2倍(使用-O3选项;使用-O0-相同)。但我没有看到像基准测试游戏中那样下降10倍

answer=“2704455”的数据

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

它们的设计目的是让自己运行得很快,生成的代码也不错(有一点优化)gccgo使用GCC现有的优化过程,并可能提供与C更为有意义的比较,但gccgo的功能尚未完成

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

FWIW,我自己对Go进行的非常简单的测试,当我查看它(基本上是一个整数加法循环)时,gccgo生成的代码接近于等价C的gcc-O0gcc-O2之间的最快范围。Go本身并不慢,但编译器还没有完成所有工作。对于一门只有10分钟历史的语言来说,这并不奇怪

发表评论