我决定比较处理并行和非并行流的速度,但为了验证测试的正确性,我在 2 个并行流上进行了测试,结果似乎是错误的:第一个流大约需要 60000000纳秒,而第二个只有 25000000。
您能解释一下我应该如何修正测量结果吗? 我在下面提供了一个编译方法,所以问题不是编译器优化的问题。
static void streamSpeed() {
int[] numbers = new int[1000];
for(int i = 0; i < 1000; numbers[i] = i++) {
;
}
long gap_2 = 0L;
long start = System.nanoTime();
List<Double> doubles_1 = (List)Arrays.stream(numbers).parallel().peek((ix) -> {
System.out.print(ix + ", ");
}).mapToDouble((ix) -> {
return (double)ix;
}).boxed().collect(Collectors.toList());
long gap_1 = System.nanoTime() - start;
System.out.println();
start = System.nanoTime();
List<Double> doubles_2 = (List)Arrays.stream(numbers).parallel().peek((ix) -> {
System.out.print(ix + ", ");
}).mapToDouble((ix) -> {
return (double)ix;
}).boxed().collect(Collectors.toList());
gap_2 = System.nanoTime() - start;
System.out.println();
System.out.println("Gap_1 : " + gap_1);
System.out.println("Gap_2 : " + gap_2);
doubles_1.forEach((ix) -> {
System.out.print(ix + ", ");
});
}
最佳答案
这个问题已经以稍微不同的方式提出了。请看一下这篇文章:
Java8 stream operations are cached?
第一次运行需要更长的时间,因为所有类和依赖项都必须第一次加载。如果您将测试扩展至运行 10 次,那么运行 2 到 10 次应该会得到几乎相同的结果。
关于java - 为什么耗时的测量是错误的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49631400/