【发布时间】:2013-05-30 06:17:58
【问题描述】:
我有一个 static List<long> primes 的所有已知素数直到某个点,以及这样的函数:
static bool isPrime(long p)
{
double rootP = Math.Sqrt(p);
foreach (long q in primes)
{
if (p % q == 0)
return false;
if (q >= rootP)
return true;
}
return true;
}
可以这样并行化:
static bool isPrime(long p)
{
double rootP = Math.Sqrt(p);
primes.AsParallel().ForAll(q =>
{
if (p % q == 0)
return false;
if (q > rootP)
break;
});
return true;
}
但是,这会产生一个编译时错误,指出我的块中的某些返回类型不能隐式转换为委托返回类型。
我对 LINQ 比较陌生,尤其是 PLINQ。对我来说,这似乎是并行性的一个很好的候选,因为每个已知素数与候选素数的检查是一个独立的过程。
是否有一种简单的方法可以修复我的块以使其正常工作,还是我需要以完全不同的方式解决这个问题?
【问题讨论】:
-
它有一个非常短的(时间上的)内部循环,所以 AsParallel() 不太可能有太大帮助 - 它可能会比非并行循环慢。您最好使用
Partitioner和Parallel.ForEach(),如图所示in my recent answer here 这并不能直接帮助您解决return false问题;您必须在循环中设置一个共享布尔值并在循环中检查它以在必要时提前退出循环,然后在外部循环完成后返回布尔值。