为什么测量经过的时间是错误的?

时间:2018-04-03 13:30:41

标签: java lambda collections stream java-stream

我决定比较处理并行和非并行流的速度,但要验证我在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 + ", ");
    });
}

1 个答案:

答案 0 :(得分:1)

这个问题的提问方式略有不同。请看一下这篇文章:

Java8 stream operations are cached?

第一次运行需要更长时间,因为所有类和依赖项都必须首次加载。如果你将测试扩展到,那么说,10次运行你应该得到几乎相同的结果2到10。