【发布时间】:2016-02-08 17:19:22
【问题描述】:
所以当我看到他们对外部迭代和内部迭代进行比较时,我正在阅读一本关于 Java 8 的书,并考虑在性能方面比较两者。
我有一个方法,它只是将一个整数序列相加到n。
迭代一:
private static long iterativeSum(long n) {
long startTime = System.nanoTime();
long sum = 0;
for(long i=1; i<=n; i++) {
sum+=i;
}
long endTime = System.nanoTime();
System.out.println("Iterative Sum Duration: " + (endTime-startTime)/1000000);
return sum;
}
顺序一 - 使用内部迭代
private static long sequentialSum(long n) {
long startTime = System.nanoTime();
//long sum = LongStream.rangeClosed(1L, n)
long sum = Stream.iterate(1L, i -> i+1)
.limit(n)
.reduce(0L, (i,j) -> i+j);
long endTime = System.nanoTime();
System.out.println("Sequential Sum Duration: " + (endTime-startTime)/1000000);
return sum;
}
我尝试对它们进行一些基准测试,结果发现使用外部迭代的性能远优于使用内部迭代的性能。
这是我的驱动程序代码:
public static void main(String[] args) {
long n = 100000000L;
for(int i=0;i<10000;i++){
iterativeSum(n);
sequentialSum(n);
}
iterativeSum(n);
sequentialSum(n);
}
Iteravtive 的运行时间总是 250ms。
我无法理解为什么内部迭代没有在这里执行外部迭代?
【问题讨论】:
-
fyi stackoverflow.com/questions/504103/… 您的测试没有按照您的预期进行
-
我尝试在循环中运行这些方法超过一千次,以预热 JIT 并遍历所有代码路径。但我没有一次看到 2 之间的差距缩小。迭代总是 250ms
标签: java iterator java-8 java-stream