1核心上的并行Java流

时间:2014-07-28 00:25:37

标签: java parallel-processing java-8 java-stream

假设我有一个天真的阶乘函数:

import java.util.stream.LongStream;

public class FactorialTest {

    static long factorial(long n, boolean parallel) {
        return (parallel
                ? LongStream.range(1, n).parallel()
                : LongStream.range(1, n))
                .reduce(1, (l, m) -> l * m);
    }

    public static void main(String[] args) {
        System.out.println(factorial(10, true));
    }
}

我觉得即使在单逻辑核心机器上,多线程减少仍然比单线程更快。 如何使用流API对其进行测试或解决此问题?

1 个答案:

答案 0 :(得分:5)

在JDK 8上,并行流默认在公共fork-join池中执行,该池记录在ForkJoinPool javadoc页面上。此页面记录了一个系统属性java.util.concurrent.ForkJoinPool.common.parallelism,您可以将其设置为控制公共池中的线程数(并行度)。

要对需要相对较少时间的代码进行基准测试,建议您使用JMH。这是一个开源的微基准测试工具,可以避免大多数基准测试陷阱,例如死代码消除和JIT预热时间。

即便如此,10!(十阶乘)只有十次乘法,只需几纳秒。更糟糕的是,您将在21!处溢出长值,这仍然是一个非常短的工作量。在这些短时间内,我怀疑设置流的开销 - 串行或并行 - 将主导实际计算。但到底是什么,继续测量吧!在任何情况下,您可能都希望找到更重的工作负载。