为什么在Scala中创建多维数组这么慢?

时间:2011-09-24 18:44:20

标签: arrays performance scala compiler-construction

考虑以下代码:

Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array(Array())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

几分钟后我中止了REPL。

我是否应该期待如此长的编译时间,或者这是编译器的问题/错误?

2 个答案:

答案 0 :(得分:6)

我认为,至少就你正在尝试的实际代码而言,误导性的标题。

让我们帮助类型推理器......

object A extends App {
  val x = Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Array[Nothing]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]()
  println(x)
}

编译得很好并且运行得很好(我甚至不需要修改JVM选项):

$ time scalac -d classes A.scala

real    0m5.179s

$ time scala -cp classes A
[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[Ljava.lang.Object;@872380

real    0m2.461s

所以它更多的是编译和类型推断,包括REPL(重写代码和重新编译)。在显式路由阶段(尝试使用scala -Xprint:all)之后,REPL似乎在某处挣扎。

答案 1 :(得分:5)

在Scala 2.9.0.1上,只要你给scalac足够的堆栈空间,这就编译(并运行)就好了:

export JAVA_OPTS="-ss128M"
scalac arrays.scala

它似乎在REPL中不起作用,但这不会让我感到惊讶......