Go是少数应该“接近金属”运行的语言之一,也就是说,它是经过编译,静态类型化的,并且无需VM即可在本地执行代码。这应该使其相对于Java,C#等具有速度优势。但是,它似乎落后于Java(请参阅《编程语言实战》)
我假设不太成熟的编译器对此负有很大责任,但是还有其他原因吗?Go的设计中是否有固有的功能可以阻止它比Java更快地运行?我对运行时模型有一个非常简单的看法,但是由于本地代码的执行,看来至少在原则上它应该比Java运行得更快。
Go是少数应该“接近金属”运行的语言之一,也就是说,它是经过编译,静态类型化的,并且无需VM即可在本地执行代码。这应该使其相对于Java,C#等具有速度优势。但是,它似乎落后于Java(请参阅《编程语言实战》)
我假设不太成熟的编译器对此负有很大责任,但是还有其他原因吗?Go的设计中是否有固有的功能可以阻止它比Java更快地运行?我对运行时模型有一个非常简单的看法,但是由于本地代码的执行,看来至少在原则上它应该比Java运行得更快。
Answers:
就语言设计而言,实际上没有什么可以使Go慢于Java的。实际上,它使您可以更好地控制数据结构的内存布局,因此对于许多常见任务而言,它应该更快一些。但是,当前的主要Go编译器,调度程序,垃圾收集器,regexp库和许多其他东西并未特别优化。这种情况正在稳步改善,但是重点似乎是要比获得微基准测试足够有用,简单和快速。
在链接的基准测试中,Go在二叉树和regexp测试上输给了Java。这些分别是内存管理系统和regexp库的测试。Go的内存管理可能会更快,并且随着时间的推移肯定会有所改善,而当前的标准regexp库是一个占位符,可用于即将实现的更好的实现。因此,输掉这两个不足为奇,并且在不久的将来利润率应该会更窄。
对于k核苷酸基准测试,很难比较,因为Java代码看起来正在使用不同的算法。即使编写了代码,Go代码也肯定会从编译器,调度程序和分配器的改进中受益,但是如果我们想更准确地进行比较,则有人必须重写Go代码才能做得更聪明。
Java在mandelbrot基准测试中胜出,因为它全部是浮点算术和循环,这是JVM在运行时生成非常好的机器代码和提升内容的好地方。相比之下,Go拥有一个非常简单的编译器,该编译器当前不提升,展开或生成非常严格的机器代码,因此它丢失并不奇怪。但是,请记住,Java计时不计算JVM的启动时间,也不计算JVM正常运行所需的运行时间。对于长时间运行的程序,这无关紧要,但是在某些情况下很重要。
至于其余的基准测试,Java和Go基本上是并驾齐驱的,其中Go占用更少的内存,并且在大多数情况下,更少的代码。因此,尽管在许多测试中Go的运行速度都比Java慢,但Java的运行速度却相当快,相比之下Go的运行情况还不错,而且Go可能会在不久的将来变得更快。
我期待gccgo(使用gcc代码生成的Go编译器)何时成熟。对于许多类型的代码,这应该使Go几乎与C保持一致,这将很有趣。
可以在运行时更快吗?是。Go在运行时会更快吗?我不知道。也许编译器生成器会以编译时间为代价添加可选的优化。但是我认为他们对此没有太大兴趣。他们在Google工作。
他们想要的是一种允许快速开发并在其工作中表现出色的语言。天哪,即使该基准是可信的,这也意味着它们的速度是C的一半,是Python的14倍。这绰绰有余。
硬件便宜,代码昂贵。随着投资的增加,代码往往变得越来越大,速度越来越慢,硬件变得越来越便宜,越来越小。您需要一种不需要4个框架和2000个类即可完成任何有用操作的语言。
Go的设计没有内在的东西,这使其变得缓慢。但是,Go的设计师固有的某些特性使其比组装要慢:常识。
objs
在for (obj : objs) { obj.meth() }
有不同的实现方式meth
,每次和JIT尝试内联它。当然,在通常情况下,所有这些实际上都是有益的,但仍然值得注意。
我还注意到 Go在regex-dna基准测试中特别慢。拉斯•考克斯(Russ Cox)解释了为什么戈(Go)在这个特定的基准测试中表现欠佳。原因是Go的regexp软件包使用了不同的匹配算法,该算法在该特定基准测试中表现不佳,但在其他基准测试中可能要快很多。Ruby,Python和其他脚本语言也在使用另一种regexp匹配算法的C实现。
最后,计算机语言基准测试游戏包含可能无法准确反映所测语言的许多特征甚至无法调解错误印象的微基准测试。谷歌最近发表的这份研究论文更准确地概述了Go,Scala,Java和C ++的几种语言特性,尤其是“ V. Performance Analysis”部分。因此,最终Go几乎像Java(占Java内存的81%)一样耗费内存,甚至消耗了Scala的170%的内存(在本文中无法找到是否考虑了JVM的内存消耗)。
但是,Go仍然很年轻,并且仍处于开发阶段(API更改)!即将有许多改进。
Go比Python快,但比Java慢。我的粗略经验发现Go比Python快很多(1-2个数量级),比Java慢10-20%。但是,如果与四核(x64)一起使用,Go的速度将比Java稍快。就内存RAM而言,Go的效率也更高。
我想补充一点关于Go与Java和Python相比的性能潜力。Go可以执行C所做的更多工作,从而不断使C胜过大多数其他语言。对于高性能代码,避免缓存丢失非常重要。要减少高速缓存未命中,需要控制数据结构的内存布局。Go允许您执行此操作。Java并非没有,这使得避免内存和缓存碎片变得更加困难。
现在,Java运行通常比Go快,因为Java垃圾收集器要复杂得多。尽管没有理由说Go垃圾收集器再好不过了。目前,Java的代码生成可能也要好得多。Go具有很大的改进潜力,例如支持矢量指令等。
因此,我认为Go超越Java只是时间问题。尽管像使用任何语言一样,用Go编写代码都不会自动更快。您必须利用语言所提供的便利。我想说Go只是提供了更多调整代码的机会。
无论如何,那只是一个开发人员的经验。