如何优化大尺寸的循环

nik*_*owj 6 c# performance .net-3.5

我有一个超过20k迭代的for循环,每次迭代需要大约两到三秒,总共大约20分钟.我如何优化这个循环.我正在使用.net3.5所以并行foreach是不可能的.所以我将200000 nos分成小块并实现了一些线程,现在我可以将时间缩短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;
    }
Run Code Online (Sandbox Code Playgroud)

Som*_*ame 3

可以通过各种技术减少循环数量。但是,这不会给您带来任何明显的改进,因为繁重的计算是在循环内执行的。如果您已经将其并行化以使用所有 CPU 核心,则无需做太多事情。需要完成一定量的计算,并且有一定的可用计算机能力。你无法从机器中榨取超出其所能提供的东西。

您可以尝试:

  1. 如果可能的话,更有效地实现你的算法
  2. 切换到更快的环境/语言,例如非托管 C/C++。

  • 如何确保有效使用所有 CPU 核心? (2认同)