1核上的并行Java流

1核上的并行Java流,java,parallel-processing,java-8,java-stream,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,

假设我有一个简单的阶乘函数:

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测试或解决此问题?

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

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


即使如此,
10(十个阶乘)只有十个倍数,只需要几纳秒。更糟糕的是,您将在
21处溢出一个长值这仍然是一个非常短的工作负载。在这些短时间内,我怀疑设置流的开销——串行或并行——将主导实际计算。但见鬼,去测量它吧!无论如何,您都可能希望找到一个更重的工作负载来进行基准测试。

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

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


即使如此,
10(十个阶乘)只有十个倍数,只需要几纳秒。更糟糕的是,您将在
21处溢出一个长值这仍然是一个非常短的工作负载。在这些短时间内,我怀疑设置流的开销——串行或并行——将主导实际计算。但见鬼,去测量它吧!无论如何,您都可能希望找到一个更重的工作负载来进行基准测试。

“我感觉多线程的缩减仍然比单线程的要快”-不要“感觉”,基准测试@正是米奇麦。如何在单核机器上强制执行多线程?这就是最初的问题。“我有一种感觉,多线程的缩减仍然比单线程更快”-不要“感觉”,基准测试@正是米奇麦。如何在单核机器上强制执行多线程?这就是最初的问题。我想问这个问题已经有一段时间了:到底哪里有文件证明Streams API使用了ForkJoin,而不管具体的池实例是什么?@MarkoTopolnik故意不指定。(我将在我的答案中添加一些限制。)将来可能会在不同类型的线程池或GPU上运行并行流,因此指定
ForkJoinPool
为时过早。当然,它不应该进入规范,但可以作为实现说明。注释还可能包括正在使用公共池这一事实(这也不符合FJP javadoc页面上所说的内容)。出于许多实际考虑,这实际上是非常重要的信息。我想问这个问题已经有一段时间了:到底哪里有文件证明Streams API使用了ForkJoin,而不管具体的池实例是什么?@MarkoTopolnik故意未指明。(我将在我的答案中添加一些限制。)将来可能会在不同类型的线程池或GPU上运行并行流,因此指定
ForkJoinPool
为时过早。当然,它不应该进入规范,但可以作为实现说明。注释还可能包括正在使用公共池这一事实(这也不符合FJP javadoc页面上所说的内容)。出于许多实际考虑,这实际上是至关重要的信息。