gpt4 book ai didi

c# - foreach循环列表性能差异

转载 作者:太空狗 更新时间:2023-10-29 22:32:50 24 4
gpt4 key购买 nike

在处理一个项目时,我遇到了以下代码,它引发了性能标记。

foreach (var sample in List.Where(x => !x.Value.Equals("Not Reviewed")))
{
//do other work here
count++;
}

我决定运行几个快速测试,将原始循环与以下循环进行比较:

foreach (var sample in List)
{
if (!sample.Value.Equals("Not Reviewed"))
{
//do other work here
count++;
}
}

也加入这个循环看看会发生什么:

var tempList = List.Where(x => !x.Value.Equals("Not Reviewed"));
foreach (var sample in tempList)
{
//do other work here
count++;
}

我还以 3 种不同的方式填充了原始列表:50-50(因此 50% 的值是“未审核”,其余为其他)、10-90 和 90-10。这些是我的结果,第一个和最后一个循环大部分是相同的,但第二个要快得多,尤其是在 10-90 的情况下。为什么呢?我一直认为 Lambda 性能不错。

编辑

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

Performance Results

编辑 2

每一个运行1000次的结果: Performance Results 1000 times

最佳答案

基本上,有少量额外的间接 - 既用于通过委托(delegate)进行的测试,也用于迭代部分。鉴于每次迭代完成的工作很少,这种额外的间接访问相对昂贵。

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

  • 定义性能要求
  • 以最清晰、最简单的方式实现功能需求
  • 根据要求衡量您的表现
  • 如果发现性能欠佳,调查原因并尽可能少地偏离清晰度,尽可能获得最大的“性价比”
  • 重复直到完成

响应编辑:

The count++ is not actually what's inside the loop, I just added that here for demonstration purposes, I guess I should've used "//do something here"

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

关于c# - foreach循环列表性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17727939/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com