我正在用 Java 中的并行流進行試驗,為此我有以下代碼用于計算之前的素數n?;旧衔矣袃煞N方法calNumberOfPrimes(long n)- 4 種不同的變體isPrime(long n)- 2 種不同的變體實際上,我對上述每種方法都有 2 個不同的變體,一個使用并行流的變體,另一個不使用并行流的變體。 // itself uses parallel stream and calls parallel variant isPrime private static long calNumberOfPrimesPP(long n) { return LongStream .rangeClosed(2, n) .parallel() .filter(i -> isPrimeParallel(i)) .count(); } // itself uses parallel stream and calls non-parallel variant isPrime private static long calNumberOfPrimesPNP(long n) { return LongStream .rangeClosed(2, n) .parallel() .filter(i -> isPrimeNonParallel(i)) .count(); } // itself uses non-parallel stream and calls parallel variant isPrime private static long calNumberOfPrimesNPP(long n) { return LongStream .rangeClosed(2, n) .filter(i -> isPrimeParallel(i)) .count(); } // itself uses non-parallel stream and calls non-parallel variant isPrime private static long calNumberOfPrimesNPNP(long n) { return LongStream .rangeClosed(2, n) .filter(i -> isPrimeNonParallel(i)) .count(); } // uses parallel stream private static boolean isPrimeParallel(long n) { return LongStream .rangeClosed(2, (long) Math.sqrt(n)) .parallel() .noneMatch(i -> n % i == 0); } // uses non-parallel stream private static boolean isPrimeNonParallel(long n) { return LongStream .rangeClosed(2, (long) Math.sqrt(n)) .noneMatch(i -> n % i == 0); }我試圖找出,和中的哪一個在正確使用并行流的效率方面是最好calNumberOfPrimesPP的calNumberOfPrimesPNP,以及為什么它是最好的。calNumberOfPrimesNPPcalNumberOfPrimesNPNPPS:我知道這不是計算素數的最佳方法。 埃拉托色尼篩法和其他更復雜的方法可以做到這一點。但是通過這個例子,我只想了解并行流的行為以及何時使用它們。
1 回答

海綿寶寶撒
TA貢獻1809條經驗 獲得超8個贊
我認為,很明顯,為什么 NPP 如此緩慢。
將結果數字排列在表格中:
| _P | _NP
-------+----------+---------
P_ | 2364 | 265
-------+----------+---------
NP_ | 11424 | 1138
-------+----------+---------
所以你看到當外部流是并行的時候它總是更快。這是因為流中有很多工作要做。因此,與要完成的工作相比,處理并行流的額外開銷很低。
您還看到,當內部流不并行時,它總是更快。isPrimeNonParallel比 快isPrimeParallel。這是因為流中沒有太多工作要做。在大多數情況下,經過幾步之后就可以清楚地知道該數字不是素數。一半的數字是偶數(只有一步)。與要完成的工作相比,處理并行流的額外開銷很高。
添加回答
舉報
0/150
提交
取消