并行流的java性能

e4eetjau  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(258)

我在用溪流做实验。更具体地说,我想比较标准流和并行流。但是,与标准流相比,使用并行流的响应时间非常慢。这很奇怪,因为我的预期正好相反。这是我为实验编写的测试代码。欢迎提出任何建议。

package streamsExamples;

import java.util.OptionalDouble;
import java.util.stream.*;
import java.util.*;

import static java.util.stream.IntStream.of;

public class ParallelSpeedTest {
  private static OptionalDouble optionalDouble;
  private final static long LIMIT = 100000000;
  private static Random random = new Random();
  private static ArrayList<Integer>  list= new ArrayList<Integer>();
  public static void main(String[] args) {
    long begin, end;

    for(long i = 0; i < LIMIT; i++){
        list.add(random.nextInt());
    }
    begin = System.currentTimeMillis();
    streamTest();
    end = System.currentTimeMillis();
    System.out.println("Stream: " +(end - begin));

    begin = System.currentTimeMillis();
    parallelStreamTest();
    end = System.currentTimeMillis();
    System.out.println("Parallel Stream: " +(end - begin));
  }

  public static void streamTest() {
    optionalDouble = IntStream
            .generate(new Random()::nextInt)
            .limit(LIMIT)
            .average();

  }

  public static void parallelStreamTest(){
    optionalDouble = IntStream
            .generate(new Random()::nextInt)
            .parallel()
            .limit(100000000)
            .average();
     }
  }
nwsw7zdq

nwsw7zdq1#

只是因为我有兴趣。。。我创建了一个示例,您可以看到parallelstream更快(对于您正在做的事情)
而且,由于编译器的优化,如果您反复调用它们,序列流和并行流都会变得很快。

import java.util.OptionalDouble;
import java.util.Random;
import java.util.stream.IntStream;

public class ParallelSpeedTest {
    private static OptionalDouble optionalDouble;
    private final static int LIMIT = 100000000;
    private static Random random = new Random();
    private static int[] arr = new int[LIMIT];

    public static void main(String[] args) {
        long begin, end;

        Random r = new Random(42);
        for (int i = 0; i < LIMIT; i++) {
            arr[i] = r.nextInt(10);
        }

        for (int i = 0; i < 100; i++) {
            System.out.println("run nr "+i);

            begin = System.currentTimeMillis();
            streamTest();
            end = System.currentTimeMillis();
            System.out.println("Stream: " + (end - begin));

            begin = System.currentTimeMillis();
            parallelStreamTest();
            end = System.currentTimeMillis();
            System.out.println("Parallel Stream: " + (end - begin));

            System.out.println();
        }
    }

    public static void streamTest() {
        optionalDouble = IntStream.of(arr).average();
    }

    public static void parallelStreamTest() {
        optionalDouble = IntStream.of(arr).parallel().average();
    }
}

输出:

run nr 0
Stream: 62
Parallel Stream: 26
...
run nr 10
Stream: 39
Parallel Stream: 17
...

run nr 20
Stream: 42
Parallel Stream: 18
...
run nr 30
Stream: 42
Parallel Stream: 16
...
run nr 50
Stream: 42
Parallel Stream: 17
...
run nr 99
Stream: 43
Parallel Stream: 19

funny thing... if I let it run for longer parallel will get slower again (no idea why)
output run nr 500
Stream: 41
Parallel Stream: 94

相关问题