Java 为什么这个并行流运行速度慢15倍?

Java 为什么这个并行流运行速度慢15倍?,java,java-8,java-stream,Java,Java 8,Java Stream,我试图向Java新手演示streams之类的东西。他说他已经读到,对于原始类型,流可能比循环慢。所以,我立即着手证明这是错误的!我震惊了 for循环和串行流的运行方式大致相同,但并行流的运行速度始终非常慢。有人能解释一下原因吗 @Test public void foo() throws Exception { Random r = new Random(); IntSummaryStatistics stats = new IntSummary

我试图向Java新手演示streams之类的东西。他说他已经读到,对于原始类型,流可能比循环慢。所以,我立即着手证明这是错误的!我震惊了

for循环和串行流的运行方式大致相同,但并行流的运行速度始终非常慢。有人能解释一下原因吗

   @Test
    public void foo() throws Exception {

        Random r = new Random();

        IntSummaryStatistics stats = new IntSummaryStatistics();

        long start = System.currentTimeMillis();
        for(int i = 0; i < 100000000;i++) {
            stats.accept(r.nextInt() * 2);
        }
        System.out.println(System.currentTimeMillis() - start);

        start = System.currentTimeMillis();
        stats = r.ints(100000000).map(rn -> rn * 2).summaryStatistics();
        System.out.println(System.currentTimeMillis() - start);

        start = System.currentTimeMillis();
        stats = r.ints(100000000).parallel().map(rn -> rn * 2).summaryStatistics();
        System.out.println(System.currentTimeMillis() - start);


    }

有时,由于并行工作所需的资源,顺序工作比并行工作花费的时间要少。我建议阅读Doug Lea的《哦,顺便说一句。我不认为这个问题是重复的。您的问题只是使用了synchronized
java.util.Random
作为IntStream的生产者。选择
j.u.c.ThreadLocalRandom
,看看会发生什么…@StefanZobel我试过了,确实提高了性能(速度慢了2倍->快了4倍)。并行性继续令人惊讶,感谢您的洞察力。也许Christian可以重新打开这个问题并自己回答。@Stefan Zobel:或者
SplittableRandom
,这可能会更好(不仅在性能方面,而且在多线程上的随机分布).
ThreadLocalRandom
可能会比
random
更好,即使在顺序情况下也是如此(顾名思义)…
1067
1047
15184