C# 有人能帮我找到这段代码中的瓶颈吗?
我在一个循环中运行了大约5000次以下代码块C# 有人能帮我找到这段代码中的瓶颈吗?,c#,entity-framework,optimization,C#,Entity Framework,Optimization,我在一个循环中运行了大约5000次以下代码块 IQueryable<IGrouping<int?, StatusLog>> allLogs = db.StatusLogs .Where(sl => sl.ID.Value.Equals(foo)) .GroupBy(sl=>sl.bar); List<StatusLog> statusLogs = new List<StatusLog>(); foreach (var
IQueryable<IGrouping<int?, StatusLog>> allLogs = db.StatusLogs
.Where(sl => sl.ID.Value.Equals(foo))
.GroupBy(sl=>sl.bar);
List<StatusLog> statusLogs = new List<StatusLog>();
foreach (var group in allLogs)
{
// do stuff that adds to statusLogs
}
if (statusLogs.Count > 0)
{
// do stuff
}
到
在所有日志中单步执行
var组
和的求值只需要3毫秒左右,那么当foreach
循环中的代码甚至没有运行时,跳转到下一条语句怎么需要50毫秒呢 将其拆分为db访问,然后再拆分为for循环和每个循环的时间(使用秒表类)
这是因为allLogs
本质上是惰性的——当在foreach
中首次枚举时,它实际上会命中数据库(请参阅“延迟查询执行”)。如果您像下面这样将收集物化,您将看到它快速地通过foreach
:
db.StatusLogs
.Where(sl => sl.ID.Value.Equals(foo))
.GroupBy(sl=>sl.bar)
.ToList(); // <-- pull the query results into memory
db.StatusLogs
其中(sl=>sl.ID.Value.Equals(foo))
.GroupBy(sl=>sl.bar)
.ToList();//您必须提供更多的代码。与系统时钟分辨率相比,50ms的时间相当短。这次你是怎么测量的?您确定其他进程在测量时没有占用大量CPU吗?您认为到数据库的往返是免费的吗?就记录而言,这并没有解决问题,它只移动到发生50毫秒的地方。我只是接受了一个答案,希望一连串的反对票能结束。@iMassakre这里没有问题要解决。无论在哪里进行数据库调用,都需要时间。我只是想解释为什么在你的情况下通过foreach需要时间。哦,我明白你的意思了。那么我想没有办法解决这个问题了。生成一份包含5000项的报告需要13分钟,这似乎太疯狂了。
if (statusLogs.Count > 0)
var allLogs = db.StatusLogs
.Where(sl => sl.ID.Value.Equals(foo))
.GroupBy(sl=>sl.bar).ToList();// tolist forces query to run now
foreach (var group in allLogs)
{
// do stuff that adds to statusLogs
}
db.StatusLogs
.Where(sl => sl.ID.Value.Equals(foo))
.GroupBy(sl=>sl.bar)
.ToList(); // <-- pull the query results into memory