有没有人使用Google的Go?我想知道如何将数学性能(例如flops)与其他语言与垃圾收集器(如Java或.NET)进行比较?
有没人调查过这个?
答案 0 :(得分:82)
理论性能:纯Go程序的理论性能介于C / C ++和Java之间。这假设是一个高级优化编译器,它还假设程序员利用该语言的所有功能(无论是C,C ++,Java还是Go)并重构代码以适应编程语言。
实用性能(截至2011年7月):标准Go编译器(5g / 6g / 8g)目前无法为高性能数字代码生成有效的指令流,因此性能将低于C / C ++或Java 。这有多种原因:每个函数调用都有一些附加指令(与C / C ++或Java相比)的开销,没有函数内联,平均质量寄存器分配,平均质量垃圾收集器,擦除绑定的能力有限检查,无法访问来自Go的向量指令,编译器不支持32位x86 CPU上的SSE2等。
结论:根据经验,预计纯Go中实现的数字代码的性能(由5g / 6g / 8g编译)比C / C ++或Java低2倍。期待未来的表现会好转。
实用性能(2013年9月):与2011年7月的旧版Go相比,Go 1.1.2能够生成更高效的数字代码,但它们的运行速度仍然比C / C ++和Java略慢。编译器甚至在32位x86 CPU上使用SSE2指令,这使得32位数字代码运行得更快,最有可能归功于更好的寄存器分配。编译器现在实现函数内联和转义分析。垃圾收集器也得到了改进,但它仍然不如Java的垃圾收集器先进。仍然不支持从Go访问向量指令。
结论:除非竞争实现使用向量指令,否则Go在数值计算中可以替代C / C ++和Java,性能差距似乎足够小。
答案 1 :(得分:34)
Go math package主要是用汇编语言编写的。
基准通常不可靠,需要解释。例如,Robert Hundt的论文Loop Recognition in C++/Java/Go/Scala看起来有缺陷。 Profiling Go Programs上的Go博客帖子剖析了Hundt的说法。
答案 2 :(得分:15)
你实际上问了几个不同的问题。首先,Go的数学表现将与其他任何事情一样快。任何编译成本机代码的语言(可以说甚至包括像.NET这样的JIT语言)都会在原始数学上表现得非常好 - 就像机器一样快。简单的数学运算很容易编译成零开销形式。这是编译(包括JIT)语言优于解释语言的区域。
你问的另一个问题是关于垃圾收集。如果你谈论重数学,这在某种程度上是一个侧面问题。这并不是说GC不会影响性能 - 实际上它会影响很多。但紧密循环的常见解决方案是避免或最小化 GC扫描。如果您正在进行紧密循环,这通常非常简单 - 您只需重新使用旧变量,而不是不断分配和丢弃它们。这可以将您的代码加速几个数量级。
至于GC实现本身 - Go和.NET都使用标记和清除垃圾收集。微软已经在他们的GC引擎中投入了大量的精力和工程,我不得不认为所有事情都考虑得很好。 Go的GC引擎正在进行中,虽然它不会感觉感觉比.NET的架构慢,但Golang的人们坚持认为它需要一些工作。 Go的规范不允许使用析构函数在加快速度方面取得了很大进展,这可能就是为什么它看起来不那么慢。
最后,在我自己的轶事经历中,我发现Go 非常快。我编写了非常简单易用的程序,这些程序在我自己的基准测试中反对高度优化的C代码,这些代码来自于一些以性能为傲的长期和备受推崇的开源项目。
问题在于,所有 Go代码都不会高效,就像所有 C代码都是高效的一样。你必须正确地构建它,这通常意味着做的事情与你从其他语言习惯的做法不同。这里提到的profiling blog post几次就是一个很好的例子。
答案 3 :(得分:2)
谷歌做了一项研究,将Go与其他一些流行语言(C ++,Java,Scala)进行比较。他们得出的结论是,表现并不那么强:
https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf
引用结论,关于Go:
Go提供了有趣的语言功能,这也允许简洁和标准化的符号。这种语言的编译器仍然不成熟,它反映了性能和二进制大小。