我的代码如下。它打印列表填充的时间。 当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
答案 0 :(得分:2)
您的基准几乎肯定不能证明您认为它的证据。在JVM上进行基准测试并不像编写一些代码,运行一次,看看需要多长时间一样简单 - 不是长镜头。请参阅以下文章:
在JVM上运行有意义的基准测试的流行工具是Google Caliper。一个很好的Scala专用工具是Rex Kerr的Thyme。
答案 1 :(得分:1)
您在此处测量的是JVM内存管理的速度有多快。算法中最慢的部分是新列表元素的内存分配。我认为减速可能是因为你的堆大小最初不足以处理所有元素,因此它需要增长,这相对较慢。
What are the Xms and Xmx parameters when starting JVMs?
尝试增加Xms,以便即使对于较大的列表,初始堆大小也足够了。