我为Goldbach的猜想编写了这个串行和并行代码,但串行代码比并行代码快。有人可以帮我吗? 有没有办法更快地并行?
这是序列号:
class GoldbachSerial
{
public bool IsPrime(long number)
{
double maxCheck = Math.Sqrt(number);
for (long i = 2; i <= maxCheck; i++)
{
if (number % i == 0) return false;
}
return true;
}
public string GetTwoPrimeNumbers(long number)
{
for (long i = 2; i <= number / 2; i++)
{
if (IsPrime(i) && IsPrime(number - i))
{
return string.Format("{0}={1}+{2}", number.ToString("N0"), i.ToString("N0"), (number - i).ToString("N0"));
}
}
return "not found";
}
}
这是并行代码:
class GoldbachParallel
{
ParallelOptions parallelOptions = new ParallelOptions
{
MaxDegreeOfParallelism = Environment.ProcessorCount
};
private bool IsPrime(long number)
{
long maxCheck = (long)Math.Sqrt(number);
bool result = true;
Parallel.For(2, maxCheck + 1, parallelOptions, (i, loopState) =>
{
if (loopState.IsStopped) return;
if (number % i == 0)
{
result = false;
loopState.Stop();
}
});
return result;
}
// private static int atomic = 0;
public string GetTwoPrimeNumbers(long number)
{
string result = "not found ";
// ParallelLoopResult r =
Parallel.For(2, (number / 2) + 1, parallelOptions, (i, loopState) =>
{
if (loopState.IsStopped) return;
if (IsPrime(i) && IsPrime(number - i))
{
// Interlocked.Increment(ref atomic);
// loopState.Break();
result = string.Format("{0}={1}+{2}", number.ToString("N0"), i.ToString("N0"), (number - i).ToString("N0"));
loopState.Stop();
}
});
return result;
}
}
答案 0 :(得分:4)
您认为哪个会更快,自己将10对单位数字加在一起,或者找到10个其他人,给他们添加一对数字,让他们都添加这些数字,然后给你回复回答?让更多人参与工作会更快吗?
现在,如果你有一个更难的问题让对方解决这样的问题,那么你可以获得更多时间同时完成高效工作,而不是在人员(或CPU)之间转移工作的时间损失。那将是有益的。
同样,有些问题不适合并行,虽然这不是你的问题。毕竟,9个女人一个月内不能生孩子。没有多少并行性会减少该活动的时间。