假设我有一个简单的阶乘函数:
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/