谷歌Go的表现?

poy*_*poy 32 performance go

那么有人使用Google的Go吗?我想知道如何将数学性能(例如flops)与其他语言与垃圾收集器(如Java或.NET)进行比较?

有没人调查过这个?

小智 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,性能差距似乎足够小.

  • 你的答案非常有用.自2013年更新以来,go已更新至go1.4.你能不能给出新Go的更新? (5认同)
  • 这非常有趣,您能否在今天的背景下向我们提供Go的评论更新? (3认同)

pet*_*rSO 34

Go 数学包主要用汇编语言编写,以提高性能.

基准通常不可靠,需要进行解释.例如,Robert Hundt 在C++/Java/Go/Scala中的论文Loop Recognition看起来有些缺陷.关于Profiling Go Programs的Go博客文章剖析了Hundt的说法.

  • 一些谷歌搜索带我到这个http://code.google.com/p/go/source/browse/#hg%2Fsrc%2Fpkg%2Fmath似乎答案是对的. (10认同)
  • 我找不到Go的数学包用汇编语写的任何证据.即使上面的链接也没有把我带到汇编代码. (3认同)

tyl*_*erl 15

你实际上问了几个不同的问题.首先,Go的数学表现将与其他任何事情一样快.任何编译为本机代码的语言(可以说甚至包括像.NET这样的JIT语言)都会在原始数学上表现得非常好 - 就像机器一样快.简单的数学运算很容易编译成零开销形式.这是编译(包括JIT)语言优于解释语言的区域.

你问的另一个问题是关于垃圾收集.如果你谈论重数学,这在某种程度上是一个侧面问题.这并不是说GC不会影响性能 - 实际上它会影响很多.但紧密循环的常见解决方案是避免最小化 GC扫描.如果您正在进行紧密循环,这通常非常简单 - 您只需重新使用旧变量,而不是不断分配和丢弃它们.这可以将代码速度提高几个数量级.

至于GC实现本身--Go和.NET都使用标记和清除垃圾收集.微软已经在他们的GC引擎中投入了大量的精力和工程,我不得不认为所有事情都考虑得很好.Go的GC引擎正在进行中,虽然它感觉不比.NET的架构慢,但Golang人坚持认为它需要一些工作.Go的规范不允许析构函数的事实在加快速度方面走了很长的路,这可能就是为什么它看起来不那么慢.

最后,在我自己的轶事经历中,我发现Go 非常快.我编写了非常简单易用的程序,这些程序在我自己的基准测试中反对高度优化的C代码,这些代码来自于一些以性能为傲的长期和备受推崇的开源项目.

问题在于并非所有 Go代码都是高效的,就像并非所有 C代码都是高效的一样.你必须正确地构建它,这通常意味着做的事情与你从其他语言习惯的做法不同.这里提到的分析博客文章是一个很好的例子.