假设我有一个天真的阶乘函数:
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对其进行测试或解决此问题?
答案 0 :(得分:5)
在JDK 8上,并行流默认在公共fork-join池中执行,该池记录在ForkJoinPool javadoc页面上。此页面记录了一个系统属性java.util.concurrent.ForkJoinPool.common.parallelism
,您可以将其设置为控制公共池中的线程数(并行度)。
要对需要相对较少时间的代码进行基准测试,建议您使用JMH。这是一个开源的微基准测试工具,可以避免大多数基准测试陷阱,例如死代码消除和JIT预热时间。
即便如此,10!
(十阶乘)只有十次乘法,只需几纳秒。更糟糕的是,您将在21!
处溢出长值,这仍然是一个非常短的工作量。在这些短时间内,我怀疑设置流的开销 - 串行或并行 - 将主导实际计算。但到底是什么,继续测量吧!在任何情况下,您可能都希望找到更重的工作负载。