我正在用 Java 中的并行流进行试验,为此我有以下代码用于计算之前的素数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,以及为什么它是最好的。calNumberOfPrimesNPPcalNumberOfPrimesNPNP
PS:我知道这不是计算素数的最佳方法。 埃拉托色尼筛法和其他更复杂的方法可以做到这一点。但是通过这个例子,我只想了解并行流的行为以及何时使用它们。
海绵宝宝撒
相关分类