提问人:Büşra Güler 提问时间:5/31/2023 最后编辑:Büşra Güler 更新时间:5/31/2023 访问量:88
如何提高 for 循环性能?
How can I improve the for loop performance?
问:
当 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;
}
答:
3赞
Vladislav
5/31/2023
#1
从我可以得出的结论是,您正在循环(,)内启动对外部源(数据库或API等)的查询。
作为一般考虑因素,应避免在循环中对每个元素进行外部源查询。
相反,在循环之前以批处理模式进行一个查询。将数据保存在内存中。然后迭代元素并针对已获取的数据进行处理。GdAksYeniQueries
GdTckkYeniQueries
如果不适合在一个查询中提取所有数据,请仍实现迭代解决方案,该解决方案将根据可配置的批大小提取数据。
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
任何并发技术都会在线程安全方面引入一系列潜在问题。因此,虽然有时很有用,但我不建议使用并行。因为在检查其他可能的改进之前,首先,然后才警告危险。
评论