Skip to main content
 首页 » 编程设计

scala之为什么 scalac 不优化简单的 `for` 构造中的开销

2025年05月04日99luoye11

这是一段代码示例,第一印象看起来像 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)转换成任何字节码形式javacfor (int i = L; i < H; i += 1) 生成?可能是因为 Scala 选择保持简单并希望开发人员简单地求助于性能更高的形式,例如 while当需要原始循环速度时循环?如果是,考虑到如此简单的 for 循环的频率,为什么这样好?

请您参考如下方法:

Scala 中的 for-comprehensions 性能目前是一个长期存在的争论。

请参阅以下链接:

TL,DR:Scala 团队决定专注于更通用的优化,而不是那些必须支持某些特定类和边缘情况(在本例中为:Range)的优化。