Kne*_*min 5 c# linq asp.net performance foreach
关于LINQ与标准foreach循环,我有一个基于效率的问题.
我有一个方法,大致如下
var foos = users.Select(this.GenerateNullableFoo).Where(foo => foo != null);
Run Code Online (Sandbox Code Playgroud)
事实证明,由于某种原因,这是非常缓慢的.使用时间戳,我能够确定缓慢的点恰好在select的迭代(从最终返回语句到下一个方法调用的开始的时间)比其他任何东西慢得多(13秒)(总时间<= 14秒) ).
当用以下代替时,整个处理时间减少到每次迭代不到1秒.
新代码:
var foos= new List<Foo>();
foreach (var user in users)
{
var foo = GenerateNullableFoo(user);
foo.IfNotNull(f => foos.Add(foo));
}
Run Code Online (Sandbox Code Playgroud)
据我所知,我的代码有效,新代码没有任何问题,但是,我完全不知道为什么使用上面的Select比看似相同的进程慢了10多倍.是否有任何见解可以解释这个差异?
此外,直到所述select/foreach 之后才对整个List进行保存,此时对db进行批量调用.
编辑:从起点到完成(和终止)的整个代码块如下:
//Code snippet pictured above
_repo.SaveFoo(Foos);
//at this point, the code terminates and is finished
Run Code Online (Sandbox Code Playgroud)
正如其他人所说,LINQ 表达式在被代码迭代之前不会投影到结果集,这意味着您所做的只是声明逻辑。
您尚未发布的代码会导致 LINQ 表达式被投影,而且很可能会被投影多次。
解决此问题的最短方法是将.ToList()添加到表达式中,这将立即投影表达式,这意味着其他代码可以使用内存中和已投影的列表,而不会导致额外的投影/计算/等。
干杯,亚伦
| 归档时间: |
|
| 查看次数: |
666 次 |
| 最近记录: |