java - 为什么耗时的测量是错误的?

标签 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 + ", ");
    });
}

最佳答案

这个问题已经以稍微不同的方式提出了。请看一下这篇文章:

Java8 stream operations are cached?

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

关于java - 为什么耗时的测量是错误的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49631400/

相关文章:

JavaFX - 切换到新场景时出现 NullPointerException

c# - C# lambda/匿名委托(delegate)中的词法范围

c# - 需要帮助理解 lambda(柯里化(Currying))

java - Iterable with size() 的成语 - 在 Iterable 和 Collection 之间?

java - 使用 Collections.sort 后在 List 中添加了新的排序方法

java - 使用 Java Streams 验证两个不同列表之间的内容时需要获取第二个列表排序

java - Eclipse 插件的堆栈跟踪

java - 构建期间发生错误。在项目上运行生成器 'CDI (Contexts and Dependency Injection) Builder' 时出错

c++ - 通过引用传递自定义优先级队列

java - 如何在没有冗余计算的情况下过滤和映射 Java 8 流中的值?