You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用并行或内存优化方案提升C#嵌套for循环代码执行效率

代码优化方案

问题描述

我需要优化以下代码以提升执行速度,可通过消耗更多内存或采用并行处理的方式实现,当前该代码在Windows 10 64位、16GB内存的PC上处理单条记录需要耗时2分钟。
已知各数据集长度:

  • data1列表长度 = 1000
  • data2列表长度 = 100000
  • data3列表长度 = 100

原始代码(含一处笔误标注)

for (int d1 = 0; d1 < data1.Count; d1++)
{
   if (data1[d1].status == 'UNMATCHED')
   {
      for (int d2 = 0; d2 < data2.Count; d2++)
      {
         if (data2[d2].status == 'UNMATCHED')
         {
            bool vMatched = false;
            for (int d3 = 0; d3 < data3.Count; d3++)
            {
                if (data3[d3].rule == "rule1")
                {
                  if (data1[d1].value == data2[d2].value)
                  {
                     data1[d1].status = 'MATCHED';
                     // 注意:原代码此处为笔误,d2是data2的索引,应改为data2[d2].status
                     // data1[d2].status = 'MATCHED';
                     data2[d2].status = 'MATCHED';
                     vMatched = true;
                     break;
                  }    
                }
                else if (data3[d3].rule == "rule2")
                {
                   // 其他规则逻辑
                }
                // 其余规则省略
                else if (data3[d3].rule == "rule100")
                {
                   // 其他规则逻辑
                }
                 
            }
            if (vMatched)
              break;
         }
      }
   }
}

性能瓶颈分析

当前代码是三重嵌套循环,时间复杂度为O(1000 * 100000 * 100) = 1e10次操作,大部分运算资源浪费在无意义的遍历和重复判断上,这是执行慢的核心原因。

优化方案

1. 预构建data2索引,消除第二层循环

提前把data2中所有UNMATCHED状态的记录,按照各规则需要的匹配字段建立哈希索引,比如针对按value匹配的rule1,构建Dictionary<TValue, List<Data2Item>> valueIndex,后续匹配时可以直接通过data1的value值O(1)拿到所有符合条件的data2记录,直接把10万次的第二层循环降到几乎为0。

2. 规则逻辑预处理,消除重复的规则判断

不要每次循环都对100条规则做字符串匹配的if else判断,提前把data3的规则转换成绑定了匹配逻辑、索引字段的规则执行列表,后续处理时直接按顺序执行规则即可,减少冗余判断。

3. 并行处理data1的未匹配记录

因为data1中每条未匹配记录的匹配逻辑相互独立,你可以使用Parallel.ForEach并行处理所有未匹配的data1记录,充分利用多核CPU的性能。注意如果多线程同时修改data2的状态,要保证操作的线程安全,或者先收集所有匹配结果,最后单线程统一更新状态,避免并发冲突。

4. 其他细节优化

  • 提前过滤掉data1和data2中已经是MATCHED状态的记录,不需要进入后续匹配逻辑
  • 匹配成功后直接终止后续规则遍历,保留原有逻辑的提前终止特性
    按以上方案优化后,整体耗时可以从2分钟降到秒级甚至毫秒级。

内容的提问来源于stack exchange,提问作者user2907940

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 14:54:03