我正在玩无限的流,并制定了这个程序进行基准测试。基本上你提供的号码越大,它的结束速度就越快。然而,我很惊讶地发现,与顺序流相比,使用parellel流导致性能呈指数级恶化。直观上,人们会期望在多线程环境中生成和评估无限数量的随机数字,但似乎并非如此。为什么是这样?为什么并行流更慢?
final int target = Integer.parseInt(args[0]);
if (target <= 0) {
System.err.println("Target must be between 1 and 2147483647");
return;
}
final long startTime, endTime;
startTime = System.currentTimeMillis();
System.out.println(
IntStream.generate(() -> new Double(Math.random()*2147483647).intValue())
//.parallel()
.filter(i -> i <= target)
.findFirst()
.getAsInt()
);
endTime = System.currentTimeMillis();
System.out.println("Execution time: "+(endTime-startTime)+" ms");
并行化的小任务总是比较慢。多线程有足够的开销,任务需要证明成本,否则你不会看到任何收益。另外,1个测试是没有意义的。至少,坚持这个循环,并取平均水平。 – Carcigenicate
@Carcigenicate除此之外,我相信Math.random()减慢它:-)检查我的答案,如果感兴趣。 –
玩-Djava.util.concurrent.ForkJoinPool.common.parallelism =,更改公共池并观察结果 –
gaston