为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
莫回无 2021-04-08 15:14:13
从2010年的计算机语言基准游戏中我们可以看到:Go平均比C慢10倍Go比Java慢3倍!考虑到Go编译器会生成用于执行的本机代码,这怎么可能?Go的编译器不成熟?还是Go语言存在一些内在问题?编辑:大多数答案否认Go语言的内在缓慢,声称问题出在不成熟的编译器中。因此,我进行了一些自己的测试来计算斐波那契数:迭代算法在Go(freebsd,6g)中以与sameC(带有O3选项)一样的速度运行。迟钝的递归代码在Go中的运行2 times速度比在C中运行的慢(使用-O3选项;使用-O0-相同)。但是我还没有看到基准测试中出现10倍的下降。
查看完整描述

3 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

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

它们旨在快速运行自己并生成可以的代码(有些优化)。gccgo使用GCC的现有优化遍历,并可能与C进行更有意义的比较,但是gccgo尚未完成功能。

基准数字几乎完全与执行质量有关。它们与这种语言没有太多关系,除非实现花费了运行时支持基准测试实际上不需要的语言功能。在大多数编译语言中,理论上足够聪明的编译器可以剔除不需要的内容,但是您到了要演示的地方,因为很少有真正的语言用户编写不使用该功能的程序。 。将事情移开而不完全删除它们(例如,在JIT编译的Java中预测虚拟调用目标)开始变得棘手。

FWIW是我自己对Go进行的非常琐碎的测试(基本上是整数加法循环),gccgo朝着介于Cgcc -O0gcc -O2C范围内的范围的快端生成了代码。Go并不是天生就很慢,但是编译器还不能做所有事情。对于使用10分钟的语言来说,这不足为奇。


查看完整回答
反对 回复 2021-04-26
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

在Go FAQ的下一版本中,应显示类似以下内容。

表现

为什么Go在基准X上表现不佳?

Go的设计目标之一是接近可比程序的C性能,但在某些基准上却表现不佳,包括在测试/基准测试中的一些基准。最慢的速度取决于在Go中没有可比较性能的版本的库。例如,数字位数取决于多精度数学程序包,而与Go语言不同,C语言版本使用GMP(用优化的汇编程序编写)。依赖于正则表达式(例如regex-dna)的基准本质上是将Go的权宜之计regexp软件包与成熟的,高度优化的正则表达式库(如PCRE)进行比较。

基准测试是通过广泛的调整赢得的,大多数基准的Go版本需要引起注意。如果您测量类似的C和Go程序(反向补码就是一个例子),您会发现这两种语言的原始性能比该套件所表明的要紧密得多。

尽管如此,仍有改进的空间。编译器很好,但是可能会更好,许多库需要大量的性能工作,并且垃圾收集器还不够快(即使这样做,请注意不要生成不必要的垃圾会产生巨大的影响)。

这是来自最近的邮件列表线程的有关计算机基准测试游戏的更多详细信息。

gccgo中的垃圾收集和性能(1)

gccgo中的垃圾收集和性能(2)

重要的是要注意,计算机基准测试只是一个游戏。在性能评估和容量规划方面有经验的人员会仔细地匹配实际和实际的工作负载;他们不玩游戏。


查看完整回答
反对 回复 2021-04-26
  • 3 回答
  • 0 关注
  • 309 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信