Scala集合行为。缓慢添加到列表

时间:2014-04-15 21:50:31

标签: scala scala-collections

我的代码如下。它打印列表填充的时间。 当circle = 1000000时,输出为300 ms 当circle = 1000000 * 10时,输出大约为7000 ms。但直觉上我预计它应该是300 * 10. Scaladoc说向List添加元素是O(1)。为什么它会像那样?

val random = new Random()
var ints: List[Int] = List()

val start = System.currentTimeMillis();

val circles = 1000000
for (i <- 1 to circles) {
  ints = random.nextInt.signum :: ints
}

println(System.currentTimeMillis() - start);

如果我使用常数而不是随机,则结果为156毫秒,5300表示圆圈= 1000000,圆圈= 1000000 * 10

2 个答案:

答案 0 :(得分:2)

您的基准几乎肯定不能证明您认为它的证据。在JVM上进行基准测试并不像编写一些代码,运行一次,看看需要多长时间一样简单 - 不是长镜头。请参阅以下文章:

在JVM上运行有意义的基准测试的流行工具是Google Caliper。一个很好的Scala专用工具是Rex Kerr的Thyme

答案 1 :(得分:1)

您在此处测量的是JVM内存管理的速度有多快。算法中最慢的部分是新列表元素的内存分配。我认为减速可能是因为你的堆大小最初不足以处理所有元素,因此它需要增长,这相对较慢。

What are the Xms and Xmx parameters when starting JVMs?

尝试增加Xms,以便即使对于较大的列表,初始堆大小也足够了。