为什么Scala for循环比逻辑上相同的循环慢?

 涅槃重生武哥 发布于 2023-01-31 11:20

我喜欢Scala的强大功能以及它们与任何monadic类型与map和flatMap集成的方式.但是,我还想做一个简单的整数循环而不会有很大的速度惩罚.为什么Scala没有以下两个逻辑上相同的循环以相似的运行时性能运行甚至编译成类似的字节代码?

// This is slow...
for (i <- 0 until n) println(s"for loop with $i")

// This runs much faster. It runs roughly at the same speed as Java code doing an identical while or for loop.
var i = 0;
while (i < n) {
  println(s"while loop with $i")
  i += 1
}

Kevin Wright.. 6

他们不同的主要原因(但不仅仅是)是拳击.

在代码中:

for (i <- 0 until n) println(s"for loop with $i")

你将一个匿名函数传递println(s"for loop with $i")给了解for (i <- 0 until n).它相当于:

(0 until n) foreach (i =>
  println(s"for loop with $i")
}

该函数在字节码中被删除,这意味着它i不能是一个原语int,它必须被装箱Integer.Java没有Fixnum引用来避免这种成本,就像Smalltalk那样(特别令人沮丧的是,考虑到旧的smalltalk有多少!)

-optimize在某些情况下使用可以提供帮助,特别是在scalac的主干版本中.

你也可以使用scalaxy/loops来加快速度:)

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