Performance 为什么golang比scala慢?

Performance 为什么golang比scala慢?,performance,scala,go,Performance,Scala,Go,在这里,我们可以看到golang的性能有时比scala慢得多。在我看来,由于golang的代码直接编译成c/c++兼容的二进制代码,而scala的代码编译成JVM字节码,golang应该有更好的性能,特别是在这些计算密集型算法中,基准测试做的。我的理解不对吗 此图表来自编程冲突。在将基准测试视为福音之前,您应该阅读射击页面上的免责声明。这些基准充其量只能用于表明对绩效的广泛期望 这就是说,JVM有十年资金充足的优化,除了启动时间外,还为运行代码提供了优异的性能。围棋仍然是一门年轻的语言。Go与J

在这里,我们可以看到golang的性能有时比scala慢得多。在我看来,由于golang的代码直接编译成c/c++兼容的二进制代码,而scala的代码编译成JVM字节码,golang应该有更好的性能,特别是在这些计算密集型算法中,基准测试做的。我的理解不对吗


此图表来自编程冲突。在将基准测试视为福音之前,您应该阅读射击页面上的免责声明。这些基准充其量只能用于表明对绩效的广泛期望


这就是说,JVM有十年资金充足的优化,除了启动时间外,还为运行代码提供了优异的性能。围棋仍然是一门年轻的语言。Go与JVM语言相距甚远,这一事实令人印象深刻。如果你喜欢在Go中编程,你不应该因为一个基准而拒绝它。

正如Brad指出的,这些结果来自一个特定的基准套件。这提供了一些信息,但不要假设它是全部。了解源代码在每种情况下是否编写得足够好,以提供最快的速度、最少的内存使用或其他一些目标,这将很有帮助

也许我们可以与另一个对语言进行排名的网站进行比较。看看比较了哪些web服务代码。尽管围棋是一门年轻的语言,但在一些基准测试中,围棋是最好的语言之一


与所有基准测试一样,它始终取决于您努力追求的目标以及您如何衡量它。

这一点将在go中讨论:

Go的设计目标之一是在可比程序中接近C的性能,但在一些基准测试中,它的性能相当差,包括一些测试/台架/射击测试。最慢的取决于在Go中没有可比性能版本的库。例如,pidigits.go依赖于一个多精度的数学软件包,而与go不同的是,C版本使用GMP(用优化汇编程序编写)。依赖正则表达式的基准测试(例如regex-dna.go)本质上是将go的原生regexp包与成熟的、高度优化的正则表达式库(如PCRE)进行比较

基准测试游戏是通过广泛的调整赢得的,大多数基准测试的Go版本需要关注。如果您测量可比较的C和Go程序(reverse-complete.Go就是一个例子),您将看到这两种语言在原始性能方面比这套套件所显示的更接近

不过,仍有改进的余地。编译器很好,但可能更好,许多库需要大量的性能工作,垃圾收集器还不够快。(即使是这样,注意不要产生不必要的垃圾也会产生巨大的影响。)


顺便说一下,考虑给定编程语言之间的10x(!)速度差。Cgcc#7比Cgcc#5慢8.3倍,Ada#3比Ada#5慢近10倍。这些基准测试提供了语言比较的大致概念,但Go和Scala之间的差异在一个数量级以内,这意味着运行时之间的任何“内在”变化都可能因实现上的差异而相形见绌:描述了它们如何通过执行更智能的内存分配来加速程序11x。也许编译器/运行时应该自动处理此类优化(就像JVM一样,在一定程度上),但我不确定您是否真的可以从这些图中得出结论,在一般情况下,“Go比Scala慢(或快)”。不过,这只是我的看法:)

以下是我对四个基准测试的看法,与scala解决方案相比,go解决方案的速度最慢

  • mandelbrot:scala实现将其内部循环展开一次。也可能是JVM可以像这样对计算进行矢量化,我认为go编译器还没有做到这一点。这是很好的手动优化,加上JVM对加速算法的更好支持
  • regex-dna:scala实现没有达到基准要求:它被要求“”(一次一个模式)匹配替换重定向文件中的模式,并记录序列长度“”,但它只是计算长度并打印它。go版本不进行匹配替换,因此速度较慢
  • k-nucleotide:scala实现已通过使用位旋转将核苷酸打包成长的而不是使用字符进行优化。这是一个很好的优化,也可以应用于Go代码
  • 二叉树:通过填充RAM测试gc性能。的确,javagc比go-gc快得多,但这不是go的最高优先级的理由是,通常可以通过不首先产生垃圾来避免实际程序中的gc

  • 因为你似乎热衷于研究这些有偏见的基准。让我们以真实场景为例,而不是一些Fibonacci实现。

    看看这些用于web框架的基准测试,测试是使用本机客户端(如果可用)完成的,有时使用OSS web框架,它们还使用许多包使用相同的语言进行测试。这些测试从请求原始字符串到使用ORM查询数据库都有所不同


    很明显,Scala的性能并不是很好,在所有的测试中,Scala的性能都低于预期。话虽如此,基准测试与现实并不接近,我建议您从工具/功能的角度来看待一种语言,或者简单地从什么角度来解决您的问题。

    该图表没有显示任何关于性能和内存使用的信息。您问错了问题。@user2864740否,它显示内存已使用。更糟糕的是,有人编辑了帖子,删除了指向获取图表的测试的URL链接。是真的