在这个test中,我们可以看到golang的性能有时比scala慢得多。在我看来,由于golang的代码直接编译为c / c ++兼容的二进制代码,而scala的代码被编译为JVM字节代码,golang应该具有更好的性能,特别是在基准测试的这些计算密集型算法中。我的理解不正确吗?
答案 0 :(得分:56)
这就是我认为在四个基准测试中发生的事情,其中go解决方案与scala解决方案相比最慢。
答案 1 :(得分:18)
此图表来自Programming Shootout。在将基准作为福音之前,您应该阅读Shootout页面上的免责声明。充其量这些基准仅用于表示对性能的广泛期望。
也就是说,JVM拥有十年资金充足的优化,除启动时间外,还为运行代码提供了出色的性能。 Go仍然是一种年轻的语言。 Go在JVM语言随地吐痰的范围内令人印象深刻。如果你喜欢Go中的编程,你不应该在一个基准测试中拒绝它。
答案 2 :(得分:14)
这在go FAQ中讨论:
Go的设计目标之一是为可比较的程序接近C的性能,但在某些基准测试中,它的表现非常差,包括测试/替补/枪战中的几个。最慢的依赖于库,Go中没有可用性能相当的库。例如,pidigits.go依赖于多精度数学包,与Go不同,C版本使用GMP(用优化的汇编程序编写)。依赖于正则表达式的基准(例如regex-dna.go)本质上是将Go的本地regexp包与成熟的,高度优化的正则表达式库(如PCRE)进行比较。
通过广泛调整赢得基准游戏,大多数基准测试的Go版本需要引起注意。如果你测量可比较的C和Go程序(reverse-complement.go就是一个例子),你会发现这两种语言的原始性能比这个套件更接近。
尽管如此,还有改进的余地。编译器很好但可能更好,许多库需要主要的性能工作,垃圾收集器还不够快。 (即使它是,注意不要产生不必要的垃圾会产生巨大的影响。)
另外,考虑给定编程语言的different versions of a benchmark之间的10x(!)速度差异。 C gcc#7比C gcc#5慢8.3倍,而Ada#3比Ada#5慢近10倍。这些基准提供了语言比较的粗略概念,但Go和Scala之间的差异在一个数量级内,这意味着运行时间之间的任何“内在”变化可能与实现中的差异相形见绌:{{3}描述了他们如何通过执行更智能的内存分配来加速程序11x。也许编译器/运行时应该自动处理这种优化(就像JVM那样,达到一定程度),但我不确定你是否能够得出结论'Go比Scala'更慢(相比更快)这些数字的一般情况。只是我的意见:))
答案 3 :(得分:11)
因为您似乎热衷于查看这些有偏见的基准。让我们以真实场景为例,而不是一些Fibonacci实现。
查看这些rankings 的Web框架基准测试,测试是使用本机客户端(如果可用)完成的,有时使用OSS Web框架,他们还使用许多软件包进行相同语言的测试。测试不同于对原始字符串的请求,使用ORM查询数据库。
很明显,在Scala低于Go的所有测试中,Scala的性能都没有接近Go。说到这一点,基准测试与现实无关,我建议你从工具/功能角度看一种语言,或者只是最好地解决你的问题。
答案 4 :(得分:4)
Brad指出,这些结果来自一个特定的基准测试套件。这提供了一些信息,但不要假设它是全局。知道源代码在每种情况下是否足够好以提供最快的速度,最少的内存使用或其他一些目标目标会很有帮助。
也许我们可以与另一个对语言进行排名的网站进行比较。查看比较哪些Web服务代码的http://www.techempower.com/benchmarks/。尽管是一种年轻的语言,Go是其中一些基准测试中最好的语言之一。
与所有基准测试一样,它总是取决于您的目标以及如何衡量它。