我喜欢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来加快速度:)