我有一个'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#代码并在计算机集群上运行它以立即从我的方法获取返回值?是否有以低价或免费提供此服务的网站?
答案 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你可以使用任何类型的通信在多台机器之间分配计算。