【发布时间】:2012-10-28 07:57:23
【问题描述】:
我有一个迭代次数超过 20k 的 for 循环,每次迭代大约需要两到三秒,总共大约需要 20 分钟。我如何优化这个 for 循环。我正在使用 .net3.5,所以并行 foreach 是不可能的。所以我将 200000 个号码分成小块并实现了一些线程,现在我可以将时间减少 50%。有没有其他方法可以优化这些 for 循环。
我的示例代码如下
static double sum=0.0;
public double AsyncTest()
{
List<Item> ItemsList = GetItem();//around 20k items
int count = 0;
bool flag = true;
var newItemsList = ItemsList.Take(62).ToList();
while (flag)
{
int j=0;
WaitHandle[] waitHandles = new WaitHandle[62];
foreach (Item item in newItemsList)
{
var delegateInstance = new MyDelegate(MyMethod);
IAsyncResult asyncResult = delegateInstance.BeginInvoke(item.id, new AsyncCallback(MyAsyncResults), null);
waitHandles[j] = asyncResult.AsyncWaitHandle;
j++;
}
WaitHandle.WaitAll(waitHandles);
count = count + 62;
newItemsList = ItemsList.Skip(count).Take(62).ToList();
}
return sum;
}
public double MyMethod(int id)
{
//Calculations
return sum;
}
static public void MyAsyncResults(IAsyncResult iResult)
{
AsyncResult asyncResult = (AsyncResult) iResult;
MyDelegate del = (MyDelegate) asyncResult.AsyncDelegate;
double mySum = del.EndInvoke(iResult);
sum = sum + mySum;
}
【问题讨论】:
-
能否优化“GetItem”以返回较小的数据集?
-
是的,这是可能的,但我需要为每 20k 个项目执行计算。
-
MyMethod I/O 是否密集?为什么需要 2-3 秒?
-
因为该方法中有超过 1000 行的计算。我们已经将那部分优化到了我们的水平。唯一摆在我们面前的就是通过并行计算来减少时间。
-
1000 行计算?你要送谁去火星?
标签: c# performance .net-3.5