这是一段代码示例,第一印象看起来像 scalac。可以很容易地优化掉:
val t0 = System.nanoTime()
for (i <- 0 to 1000000000) {}
val t1 = System.nanoTime()
var i = 0
while (i < 1000000000) i += 1
val t2 = System.nanoTime()
println((t1 - t0).toDouble / (t2 - t1).toDouble)
以上代码打印76.30068413477652 ,并且随着迭代次数的增加,该比率似乎变得更糟。
有什么特别的原因吗scalac选择不优化for (i <- L to/until H)转换成任何字节码形式javac为 for (int i = L; i < H; i += 1) 生成?可能是因为 Scala 选择保持简单并希望开发人员简单地求助于性能更高的形式,例如 while当需要原始循环速度时循环?如果是,考虑到如此简单的 for 循环的频率,为什么这样好?
请您参考如下方法:
Scala 中的 for-comprehensions 性能目前是一个长期存在的争论。
请参阅以下链接:
- http://www.scala-lang.org/old/node/9637.html
- http://scala-programming-language.1934581.n4.nabble.com/optimizing-simple-fors-td2545502.html
TL,DR:Scala 团队决定专注于更通用的优化,而不是那些必须支持某些特定类和边缘情况(在本例中为:Range)的优化。


