为什么golang比scala慢?

 我没资格我不配 发布于 2023-02-07 10:23

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

http://benchmarksgame.alioth.debian.org/u64/chartvs.php?r=eNoljskRAEEIAlPCA48ozD%2Bb1dkX1UIhzELXeGcih5BqXeksDvbs8Vgi9HFr23iGiD82SgxJqRWkKNctgkMVUfwlHXnZWDkut%2BMK1nGawoYeDLlYQ8eLG1tvF91Dd8NVGm4sBfGaYo0Pok0rWQ%3D%3D&m=eNozMFFwSU1WMDIwNFYoNTNRyAMAIvoEBA%3D%3D&w=eNpLz%2FcvTk7MSQQADkoDKg%3D%3D

4 个回答
  • 以下是我认为在四个基准测试中发生的事情,其中​​go解决方案与scala解决方案相比最慢.

      mandelbrot:scala实现的内部循环展开了一次.也许JVM可以像这样对计算进行矢量化,我认为go编译器还没有这样做.这是一个很好的手动优化加上更好的JVM支持加速算术.

      regex-dna:scala实现没有做基准测试所要求的:它被要求""(一次一个模式)匹配 - 替换重定向文件中的模式,并记录序列长度"""但它只是计算长度并打印出来.go版本进行匹配替换,因此速度较慢.

      k-核苷酸:scala实现已经通过使用bit-twiddling将核苷酸包装成长而不是使用的chars进行了优化.这是一个很好的优化,也可以应用于Go代码.

      二叉树:这通过填充RAM来测试gc性能.确实,java gc比go gc快得多,但是这个不是go的最高优先级的论点是,通常可以通过不首先产生垃圾来避免实际程序中的gc.

    2023-02-07 10:23 回答
  • 这在常见问题解答中讨论:

    Go的设计目标之一是为可比较的程序接近C的性能,但在某些基准测试中,它的表现非常糟糕,包括测试/替补/枪战中的几个.最慢的依赖于库,Go中没有可用性能相当的库.例如,pidigits.go依赖于多精度数学包,与Go不同,C版本使用GMP(用优化的汇编程序编写).依赖于正则表达式的基准(例如regex-dna.go)实际上是将Go的本地regexp包与成熟的,高度优化的正则表达式库(如PCRE)进行比较.

    通过广泛的调整赢得基准游戏,大多数基准测试的Go版本需要引起注意.如果你测量可比较的C和Go程序(reverse-complement.go就是一个例子),你会发现两种语言的原始性能比这个套件所表明的要接近得多.

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

    另外,考虑给定编程语言的不同版本基准测试之间的10倍(!)速度差异.C gcc#7比C gcc#5慢8.3倍,而Ada#3比Ada#5慢近10倍.这些基准测试提供了语言比较的粗略概念,但Go和Scala之间的差异在一个数量级内,这意味着运行时间之间的任何"内在"变化可能与实现中的差异相形见绌:这篇文章描述了如何他们通过执行更智能的内存分配来加速程序11x.也许编译器/运行时应该自动处理这种优化(就像JVM那样,达到一定程度),但我不确定你是否能够得出结论'Go比Scala'更慢(相比更快)这些数字的一般情况.只是我的意见虽然:)

    2023-02-07 10:23 回答
  • 因为您似乎热衷于查看这些有偏见的基准测试.让我们以真实场景为例,而不是一些Fibonacci实现.

    看看这些Web框架基准测试的排名,测试是使用本机客户端(如果可用)完成的,有时使用OSS Web框架,他们也使用许多软件包进行相同语言的测试.测试从对原​​始字符串的请求到使用ORM查询数据库各不相同.

    很明显,在Scala低于Go的所有测试中,Scala的性能都没有接近Go.说到这一点,基准测试与现实无关,我建议你从工具/功能角度看一种语言,或者只是最好地解决你的问题.

    2023-02-07 10:24 回答
  • This chart is from the Programming Shootout. You should read the disclaimers on the Shootout page before taking the benchmarks as gospel. At best these benchmarks are only useful for indicating broad expectations of performance.

    That said, the JVM has a decade of well-funded optimization and apart from startup time, provides excellent performance for running code. Go is still a young language. The fact that Go comes within spitting distance of a JVM language is impressive. If you enjoy programming in Go, you should not reject it over one benchmark.

    2023-02-07 10:24 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有