请有人向我解释,为什么Array.map(f:A => B)方法的实现速度比这段代码慢5倍以上:
val list = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
val newList = new Array[Int](size)
var j = 0
while (j < size) {
newList(j) = list(j)
j += 1
}
Array类中的方法映射(f:A =&gt; B)由TraversableLike特性提供,它使用Scala'for loop'迭代输入Array对象的元素,这当然比使用'while loop'。
Scala版本:2.9.2 Java:jdk1.6.0_23 64bit windows
答案 0 :(得分:14)
map
是一个通用操作(而不是专门的(尚未))。因此,您必须在进出函数的途中对操作进行装箱/取消装箱。不出所料,它要慢得多。这不是使用循环的风格,而是罪魁祸首。
这样做的原因是为了保持代码的一致性和易维护性。由于无数人无限精心处理代码,每种方法都是手工制作的,以获得最佳速度,同时仍然是通用的。通用实用程序一直受到速度的青睐,因为你可以通过手动编写while循环来获得速度,但是如果它不是通用的而你需要它,那么你就会陷入困境。
通过对原始集合进行操作来提高Scala的性能是一个目标,但可能不是使用Scala的团队的最高目标。现在,如果你需要速度,请使用while循环。