在这test中,我们可以看到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

推荐答案

以下是我认为与Scala解决方案相比Go解决方案最慢的四个基准测试中的情况.

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

Go相关问答推荐

迭代项列表时如何超时并发调用

杜松子wine -戈尼克背景在 children 围棋例行公事中被取消

追加一个字节数组的分配比2个字节数组的分配要少得多

验证访问令牌(密钥罩)

GoLang:无法发送带有附件的邮箱

使用 Golang 获取目录磁盘使用情况

在 GoLang 中对自定义 struct 体数组进行排序

「GORM错误」不支持的数据类型:&[],不正确的模式

Golang校验器包:重命名字段错误处理

如何从Go项目连接Microsoft Access数据库?

如何解决我的 Go 聊天应用程序中 cookie 未在本地主机端口之间传输的问题?

无法从主域访问子域:无Access-Control-Allow-Origin

为什么 `append(x[:0:0], x...)` 将切片复制到 Go 中的新后备数组中?

如何使用 Docker 引擎 SDK 和 Golang 运行 docker 挂载卷

如何使用 Docker 引擎 SDK 和 Golang 运行 docker 挂载卷

从动态输入中提取字符串,其中部分字符串可能不存在

Go:等待多个通道的性能损失

如何从 Go 1.18 中的单个方法返回两种不同的具体类型?

实现接口的指针的泛型类型是什么?

Go 错误:cannot use generic type without instantiation