将方法的运行时间从24小时减少到1小时

时间:2014-05-22 17:07:49

标签: c# performance parallel-processing distributed-computing

我有一个'For'循环,我需要从0运行到2,147,483,647(int.MaxValue)。在循环内部,我正在调用一个计算非常复杂的方程的方法,它返回每个参数的值。我希望得到最高的回报价值。

我的for循环的总运行时间大约需要24小时。如何才能将代码的运行时间缩短到一小时?如果我使用分布式计算,可能需要4个小时?

    static void Main(string[] args)
    {
        CheckValuesZeroToMaxInt();
        Console.ReadLine();
    }

    private static void CheckValuesZeroToMaxInt()
    {
        for (int i = 0; i < int.MaxValue; i++)
        {
            ComplexMath(i);
        }
    }

我知道如何使用'Parallel.For',但这仍然提供了很少的帮助。如何获取我的c#代码并在计算机集群上运行它以立即从我的方法获取返回值?是否有以低价或免费提供此服务的网站?

1 个答案:

答案 0 :(得分:3)

在一台计算机上执行此操作的最简单方法是使用Parallel.For-loop

private static void CheckValuesZeroToMaxInt()
{
    object maxValueLock = new object();
    int maxValue = int.MinValue;

    Parallel.For(0, int.MaxValue, i =>
    {
        int tmpMaxValue = ComplexMath(i);

        if (tmpMaxValue > maxValue)
        {
            lock(maxValueLock)
            {
                if (tmpMaxValue > maxValue)
                    maxValue = tmpMaxValue;
            }
        }
    }

    Console.WriteLine(maxValue);
}

但是,由于你的ComplexMath函数只需要大约0.04毫秒((24 / (2^31)) * 3600 * 1000)来执行,你可能会遇到持续锁定并且几乎不会得到任何改进。为了防止这种情况发生,我们可以更改上述函数以在线程中执行更多步骤。

const long million = 1000*1000;

private static void CheckValuesZeroToMaxInt()
{
    object maxValueLock = new object();
    int maxValue = int.MinValue;

    Parallel.For(0, (int.MaxValue / million) + 1, i =>
    {
        int privateMaxValue = int.MinValue;

        for (long j = i * million; j < (i+1) * million && j < int.MaxValue; j++)
        {
            int tmpMaxValue = ComplexMath(j);

            if (tmpMaxValue > privateMaxValue)
            {
                privateMaxValue = tmpMaxValue;
            }
        }

        lock(maxValueLock)
        {
            if (privateMaxValue > maxValue)
                maxValue = privateMaxValue;
        }
    }

    Console.WriteLine(maxValue);
}

第二个版本应该与处理器数量成比例地线性扩展,因此如果您在具有24个内核的计算机上运行它,它将在1小时内完成。当然不是Parallel.For你可以使用任何类型的通信在多台机器之间分配计算。