SOf*_*tic 5 c# performance foreach lambda
在处理项目时,我遇到了以下代码,这引发了一个性能标志.
foreach (var sample in List.Where(x => !x.Value.Equals("Not Reviewed")))
{
//do other work here
count++;
}
Run Code Online (Sandbox Code Playgroud)
我决定运行几个快速测试,将原始循环与以下循环进行比较:
foreach (var sample in List)
{
if (!sample.Value.Equals("Not Reviewed"))
{
//do other work here
count++;
}
}
Run Code Online (Sandbox Code Playgroud)
并把这个循环扔进去看看会发生什么:
var tempList = List.Where(x => !x.Value.Equals("Not Reviewed"));
foreach (var sample in tempList)
{
//do other work here
count++;
}
Run Code Online (Sandbox Code Playgroud)
我还用3种不同的方式填充了原始列表:50-50(所以50%的值"未经审核",其余为其他),10-90和90-10.这些是我的结果,第一个和最后一个循环大部分是相同的,但第二个循环要快得多,特别是在10-90的情况下.为什么呢?我一直认为Lambda表现很好.
编辑
该count++实际上不是什么内循环,我只是说,这里出于演示的目的,我想我应该已经使用"//做的东西在这里"

编辑2
结果每次运行1000次:

基本上,有少量的额外间接 - 通过委托进行测试,以及迭代部分.考虑到每次迭代完成的工作量很少,额外的间接是相对昂贵的.
在我看来,这既不令人惊讶也不令人担忧.如果您处于实际应用程序中非常重要的罕见情况,那么您可以轻松执行这种微优化.根据我的经验,这种循环很少成为应用程序中的一个重要瓶颈.通常的做法应该是:
回复编辑:
count ++实际上并不是循环中的内容,我只是为了演示目的而添加,我想我应该使用"//在这里做点什么"
那是重要的一点 - 在那里完成的工作越多,其他任何事情就越不重要.只是计数很快,所以我希望看到一个很大的差异.做任何数量的实际工作,差异会更小.