我在测试无限流时,写了个基准测试程序。提供的数字越大,程序完成的速度就越快。但是,我惊讶地发现使用并行流比顺序流的性能要差得多。直觉上,人们会认为在多线程环境下生成和评估随机数的无限流会更快,但事实似乎并不是这样。为什么会这样呢?
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");
Random.ints()
流可以获取一串随机数吗? - Louis WassermanfindFirst()
与流的遭遇顺序绑定,这会妨碍库进行并行化(你应该使用findAny()
替代)。其次,每个元素所执行的工作量较少,这意味着创建、调度和协调任务的开销可能会压倒实际工作量。此外,每个元素的工作量也没有表现出很多的局部性。因此,并行加速的条件并不是很成熟。(另外,你的基准测试方法很可能会得到毫无意义的数字。) - Brian Goetzgenerate()
函数的结果是无序的。但并行和遇到顺序之间的关系是微妙的,并且经常导致无法很好地并行化。因此,即使它不适用于这个特定代码片段,我觉得提到这种联系也是值得的。 - Brian Goetz