我正在玩無限的流,並制定了這個程序進行基準測試。基本上你提供的號碼越大,它的結束速度就越快。然而,我很驚訝地發現,與順序流相比,使用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