如何提高 for 循环性能?

How can I improve the for loop performance?

提问人:Büşra Güler 提问时间:5/31/2023 最后编辑:Büşra Güler 更新时间:5/31/2023 访问量:88

问:

当 belgeList.length = 200 时,它会在 16 秒内完成循环。但是,当我想列出 200 多个时,我期望更多。我怎样才能加快这个循环?

internal DtResult documentCheckList(AksBelgeKontrolData[] belgeList, string dmUser = null)
{

    if ((dmUser == null) || (dmUser == "") || (CurrentDomain == "nvi.local"))
        dmUser = "MERNIS\\************";
    
    
    Stopwatch sw = new Stopwatch();
    sw.Start();
    for (int i = 0; i < belgeList.Length; i++)
    {
        var belgeData = belgeList[i];
        var anaBelgeTur = belgeData.AnaBelgeTur;

        if (anaBelgeTur == AnaBelgeTur.AksYeniBelge)
        {
            belgeList[i].BelgeVar = GdAksYeniQueries.AksBelgeKontrolu(belgeData, dmUser);
        }
        else if (anaBelgeTur == AnaBelgeTur.TckkYeniBelge)
        {
            belgeList[i].BelgeVar = GdTckkYeniQueries.TckkBelgeKontrolu(belgeData, dmUser);
        }
        //else if (anaBelgeTur == AnaBelgeTur.MernisBelge)
        //{
        //    belgeList[i].BelgeVar = GdMernisQueries.MernisBelgeKontrolu(belgeData, dmUser);
        //}
    }

    DtResult result = new DtResult { ResultState = DtResultState.Ok };
  
    result.BelgeKontrolListesi = belgeList;
    sw.Stop();
    var test = sw.ElapsedMilliseconds;
    return result;

}
C# .NET 性能 循环 for 循环

评论

3赞 Tatranskymedved 5/31/2023
请将函数名称重写为英文(至少在 SO 上),以便人们可以理解您要实现的目标。

答:

3赞 Vladislav 5/31/2023 #1

从我可以得出的结论是,您正在循环(,)内启动对外部源(数据库或API等)的查询。 作为一般考虑因素,应避免在循环中对每个元素进行外部源查询。 相反,在循环之前以批处理模式进行一个查询。将数据保存在内存中。然后迭代元素并针对已获取的数据进行处理。GdAksYeniQueriesGdTckkYeniQueries

如果不适合在一个查询中提取所有数据,请仍实现迭代解决方案,该解决方案将根据可配置的批大小提取数据。

0赞 Manel Solis 5/31/2023 #2

若要加快 for 循环,可以考虑使用并行处理技术在多个线程或处理器之间分配工作负载。下面是一个示例,说明如何使用 Parallel.For 修改代码以利用并行处理:

internal DtResult documentCheckList(AksBelgeKontrolData[] belgeList, string dmUser = null)
{
    if ((dmUser == null) || (dmUser == "") || (CurrentDomain == "nvi.local"))
        dmUser = "MERNIS\\************";

    Stopwatch sw = new Stopwatch();
    sw.Start();

    // Use Parallel.For to process the loop in parallel
    Parallel.For(0, belgeList.Length, i =>
    {
        var belgeData = belgeList[i];
        var anaBelgeTur = belgeData.AnaBelgeTur;

        if (anaBelgeTur == AnaBelgeTur.AksYeniBelge)
        {
            belgeList[i].BelgeVar = GdAksYeniQueries.AksBelgeKontrolu(belgeData, dmUser);
        }
        else if (anaBelgeTur == AnaBelgeTur.TckkYeniBelge)
        {
            belgeList[i].BelgeVar = GdTckkYeniQueries.TckkBelgeKontrolu(belgeData, dmUser);
        }
        //else if (anaBelgeTur == AnaBelgeTur.MernisBelge)
        //{
        //    belgeList[i].BelgeVar = GdMernisQueries.MernisBelgeKontrolu(belgeData, dmUser);
        //}
    });

    DtResult result = new DtResult { ResultState = DtResultState.Ok };
    result.BelgeKontrolListesi = belgeList;
    sw.Stop();
    var test = sw.ElapsedMilliseconds;
    return result;
}

评论

0赞 JonasH 5/31/2023
任何并发技术都会在线程安全方面引入一系列潜在问题。因此,虽然有时很有用,但我不建议使用并行。因为在检查其他可能的改进之前,首先,然后才警告危险。