foreach循环列出性能差异

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次: 表现结果1000次

Jon*_*eet 9

基本上,有少量的额外间接 - 通过委托进行测试,以及迭代部分.考虑到每次迭代完成的工作量很少,额外的间接是相对昂贵的.

在我看来,这既不令人惊讶也不令人担忧.如果您处于实际应用程序中非常重要的罕见情况,那么您可以轻松执行这种微优化.根据我的经验,这种循环很少成为应用程序中的一个重要瓶颈.通常的做法应该是:

  • 定义性能要求
  • 以最清晰,最简单的方式实现功能需求
  • 根据要求衡量您的表现
  • 如果发现性能需要,请调查原因,尽可能少地避开清晰度,获得最大的"降压"
  • 重复,直到你完成

回复编辑:

count ++实际上并不是循环中的内容,我只是为了演示目的而添加,我想我应该使用"//在这里做点什么"

那是重要的一点 - 在那里完成的工作越多,其他任何事情就越不重要.只是计数很快,所以我希望看到一个很大的差异.做任何数量的实际工作,差异会更小.