7

请有人向我解释一下,为什么 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
}

TraversableLike trait 提供的 Array 类中的方法 map(f: A=> B) 使用 Scala 'for loop' 来迭代输入 Array 对象的元素,当然这比使用 'while 循环要慢得多'。

Scala 版本:2.9.2 Java:jdk1.6.0_23 64bit windows

4

1 回答 1

14

map是一个通用操作(还没有专门化)。因此,您必须在进出功能的过程中对操作进行装箱/拆箱。不出所料,它要慢得多。这是罪魁祸首,而不是使用的循环样式。

这样做的原因是为了代码的一致性和易于维护。由于有无数人无限细心地编写代码,每种方法都是手工制作的,以实现最佳速度,同时仍然是通用的。通用实用程序比速度更受青睐,因为您总是可以通过手动编写 while 循环来恢复速度,但如果它不是通用的并且您需要它,那么您就会陷入困境。

通过对原始集合进行操作来提高 Scala 的性能是一个目标,但可能不是 Scala 团队的首要目标。现在,如果您需要速度,请使用 while 循环。

于 2012-10-21T16:34:48.930 回答