C# 为什么串行代码比并行代码快得多?

C# 为什么串行代码比并行代码快得多?,c#,parallel-processing,C#,Parallel Processing,我为哥德巴赫的猜想写了这个串行和并行代码,但是串行代码比并行代码快。有人能帮我吗? 有没有办法使并行速度更快 这是串行代码: class GoldbachSerial { public bool IsPrime(long number) { double maxCheck = Math.Sqrt(number); for (long i = 2; i <= maxCheck; i++) { if (

我为哥德巴赫的猜想写了这个串行和并行代码,但是串行代码比并行代码快。有人能帮我吗? 有没有办法使并行速度更快

这是串行代码:

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";
    }
}

你认为哪一个更快,你自己把10对数字相加,还是找另外10个人,给他们一对数字相加,让他们把这些数字相加,然后给你答案?让更多的人做这项工作会更快吗

现在,如果您有一个更难的问题需要对方解决,这样您可以在同一时间获得更多的时间来完成生产性工作,而不是在人员(或CPU)之间移动工作所损失的时间,那么这将是有益的


同样,有些问题不适合并行性,尽管这不是您的问题。毕竟,女人不能在一个月内生孩子。再多的并行性也不能缩短这项活动的时间。

你认为哪一种更快,你自己把10对单位数相加,还是找10个人,给他们所有人一对数字相加,让他们把这些数字相加,然后给你答案?让更多的人做这项工作会更快吗

现在,如果您有一个更难的问题需要对方解决,这样您可以在同一时间获得更多的时间来完成生产性工作,而不是在人员(或CPU)之间移动工作所损失的时间,那么这将是有益的


同样,有些问题不适合并行性,尽管这不是您的问题。毕竟,女人不能在一个月内生孩子。再多的并行性也不会缩短该活动的时间。

您的并行性太高了。在您的情况下,并行性的开销远远大于收益。您有2500000个内核吗?不确定如果您没有空闲的CPU来运行工作,为什么您希望CPU密集型工作运行得更快…请使用。A.筛子。算法改进将比naive Parallel.For快很多倍。此外,筛子往往令人尴尬parallel@BenVoigt或者更好的方法是,使用已经花费大量时间编写尽可能优化的实现的数学库来确定一个数字是素数还是素数序列,正如其他人所说,不要让每个简单的任务都并行。我使用了普通
IsPrime
和并行
GetTwoPrimeNumbers
,数字
1234567
的任务在
0.3
中完成,非并行版本的任务在
0.6
中完成。虽然算法的速度在很大程度上取决于数字。一个可能需要很长时间,另一个可能只需要一毫秒。使用可以很好地并行编写的筛选算法。但同样地,它应该用于一次找到一个素数。你太过分了。在您的情况下,并行性的开销远远大于收益。您有2500000个内核吗?不确定如果您没有空闲的CPU来运行工作,为什么您希望CPU密集型工作运行得更快…请使用。A.筛子。算法改进将比naive Parallel.For快很多倍。此外,筛子往往令人尴尬parallel@BenVoigt或者更好的方法是,使用已经花费大量时间编写尽可能优化的实现的数学库来确定一个数字是素数还是素数序列,正如其他人所说,不要让每个简单的任务都并行。我使用了普通
IsPrime
和并行
GetTwoPrimeNumbers
,数字
1234567
的任务在
0.3
中完成,非并行版本的任务在
0.6
中完成。虽然算法的速度在很大程度上取决于数字。一个可能需要很长时间,另一个可能只需要一毫秒。使用可以很好地并行编写的筛选算法。但它同样应该用于一次查找一个素数。
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;
    }
}