小智 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,性能差距似乎足够小.
pet*_*rSO 34
Go 数学包主要用汇编语言编写,以提高性能.
基准通常不可靠,需要进行解释.例如,Robert Hundt 在C++/Java/Go/Scala中的论文Loop Recognition看起来有些缺陷.关于Profiling Go Programs的Go博客文章剖析了Hundt的说法.
tyl*_*erl 15
你实际上问了几个不同的问题.首先,Go的数学表现将与其他任何事情一样快.任何编译为本机代码的语言(可以说甚至包括像.NET这样的JIT语言)都会在原始数学上表现得非常好 - 就像机器一样快.简单的数学运算很容易编译成零开销形式.这是编译(包括JIT)语言优于解释语言的区域.
你问的另一个问题是关于垃圾收集.如果你谈论重数学,这在某种程度上是一个侧面问题.这并不是说GC不会影响性能 - 实际上它会影响很多.但紧密循环的常见解决方案是避免或最小化 GC扫描.如果您正在进行紧密循环,这通常非常简单 - 您只需重新使用旧变量,而不是不断分配和丢弃它们.这可以将代码速度提高几个数量级.
至于GC实现本身--Go和.NET都使用标记和清除垃圾收集.微软已经在他们的GC引擎中投入了大量的精力和工程,我不得不认为所有事情都考虑得很好.Go的GC引擎正在进行中,虽然它感觉不比.NET的架构慢,但Golang人坚持认为它需要一些工作.Go的规范不允许析构函数的事实在加快速度方面走了很长的路,这可能就是为什么它看起来不那么慢.
最后,在我自己的轶事经历中,我发现Go 非常快.我编写了非常简单易用的程序,这些程序在我自己的基准测试中反对高度优化的C代码,这些代码来自于一些以性能为傲的长期和备受推崇的开源项目.
问题在于并非所有 Go代码都是高效的,就像并非所有 C代码都是高效的一样.你必须正确地构建它,这通常意味着做的事情与你从其他语言习惯的做法不同.这里提到的分析博客文章是一个很好的例子.
归档时间: |
|
查看次数: |
36522 次 |
最近记录: |