java - 1 个核心上的并行 Java 流

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

最佳答案

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

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

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

关于java - 1 个核心上的并行 Java 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24987021/

相关文章:

java - 如何以相反的顺序对 IntStream 进行排序

methods - Java 8 中方法引用和 lambda 的类型

java - 对象池、IoC 和工厂 : When and Where?

java - 使用 Selenium 截屏

java - Java 中的点对点电子表格应用程序

java - 从一个字符串中查找模式以应用于另一个字符串 - Java

r - 使用并行时如何 `print`或 `cat`

python - 并行调用对象方法

c - openMP 的性能改进

java - 了解java中的 'TypeElement'和 'DeclaredType'接口(interface)