Find() 与 FirstOrDefault() 的性能[重复]

2023-11-24

类似问题:
Find() 与Where().FirstOrDefault()

在具有单个字符串属性的简单引用类型的大序列中搜索 Diana 得到了一个有趣的结果。

using System;
using System.Collections.Generic;
using System.Linq;

public class Customer{
    public string Name {get;set;}
}

Stopwatch watch = new Stopwatch();        
    const string diana = "Diana";

    while (Console.ReadKey().Key != ConsoleKey.Escape)
    {
        //Armour with 1000k++ customers. Wow, should be a product with a great success! :)
        var customers = (from i in Enumerable.Range(0, 1000000)
                         select new Customer
                         {
                            Name = Guid.NewGuid().ToString()
                         }).ToList();

        customers.Insert(999000, new Customer { Name = diana }); // Putting Diana at the end :)

        //1. System.Linq.Enumerable.DefaultOrFirst()
        watch.Restart();
        customers.FirstOrDefault(c => c.Name == diana);
        watch.Stop();
        Console.WriteLine("Diana was found in {0} ms with System.Linq.Enumerable.FirstOrDefault().", watch.ElapsedMilliseconds);

        //2. System.Collections.Generic.List<T>.Find()
        watch.Restart();
        customers.Find(c => c.Name == diana);
        watch.Stop();
        Console.WriteLine("Diana was found in {0} ms with System.Collections.Generic.List<T>.Find().", watch.ElapsedMilliseconds);
    }

enter image description here

这是因为 List.Find() 中没有枚举器开销还是因为这再加上其他原因?

Find()运行速度几乎快两倍,希望.Net团队将来不会将其标记为“过时”。


我能够模仿你的结果,所以我反编译了你的程序,两者之间存在差异Find and FirstOrDefault.

首先是编译后的程序。我将你的数据对象设为匿名数据项只是为了编译

    List<\u003C\u003Ef__AnonymousType0<string>> source = Enumerable.ToList(Enumerable.Select(Enumerable.Range(0, 1000000), i =>
    {
      var local_0 = new
      {
        Name = Guid.NewGuid().ToString()
      };
      return local_0;
    }));
    source.Insert(999000, new
    {
      Name = diana
    });
    stopwatch.Restart();
    Enumerable.FirstOrDefault(source, c => c.Name == diana);
    stopwatch.Stop();
    Console.WriteLine("Diana was found in {0} ms with System.Linq.Enumerable.FirstOrDefault().", (object) stopwatch.ElapsedMilliseconds);
    stopwatch.Restart();
    source.Find(c => c.Name == diana);
    stopwatch.Stop();
    Console.WriteLine("Diana was found in {0} ms with System.Collections.Generic.List<T>.Find().", (object) stopwatch.ElapsedMilliseconds);

这里要注意的关键是FirstOrDefault被召唤Enumerable然而Find作为源列表上的方法被调用。

那么,find 在做什么呢?这是反编译后的Find method

private T[] _items;

[__DynamicallyInvokable]
public T Find(Predicate<T> match)
{
  if (match == null)
    ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
  for (int index = 0; index < this._size; ++index)
  {
    if (match(this._items[index]))
      return this._items[index];
  }
  return default (T);
}

因此,它迭代一个有意义的项目数组,因为列表是数组的包装器。

然而,FirstOrDefault,在Enumerable类、用途foreach迭代项目。这使用列表的迭代器并移动到下一个。我认为你看到的是迭代器的开销

[__DynamicallyInvokable]
public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
  if (source == null)
    throw Error.ArgumentNull("source");
  if (predicate == null)
    throw Error.ArgumentNull("predicate");
  foreach (TSource source1 in source)
  {
    if (predicate(source1))
      return source1;
  }
  return default (TSource);
}

Foreach 只是句法糖关于使用可枚举模式。看看这张图片

enter image description here.

我单击 foreach 来查看它在做什么,您可以看到 dotpeek 想要带我到 enumerator/current/next 实现,这是有意义的。

除此之外,它们基本上是相同的(测试传入的谓词以查看某个项目是否是您想要的)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Find() 与 FirstOrDefault() 的性能[重复] 的相关文章

  • 运行命令行进程并在该进程仍在运行时获取输出?

    如何运行命令行进程并在该进程仍在运行时获取输出 我的意思是使用自己的进度条运行 CLI 进程 可执行文件本身需要很长时间才能完成操作 所以我想从自己的进程中获取进度信息来显示我的应用程序中的进度 否则我不这样做在进程完成之前没有任何信息来显
  • iPhone 编程游戏

    使用 Objective C 还是 C 为 iPhone 编写游戏最好 像 Flight Control 这样的游戏会用什么语言编写 图形应采用什么格式才能在 iPhone 上正确显示并快速加载 像 Flight Control 这样的游戏
  • 如何使用 Regsvr32 注册 .NET COM DLL?

    我有一个使用 COM DLL 的 VB6 应用程序 该DLL是用C 编写的 在 C 项目属性中 我检查了 Register for COM interop 选项 VB6 应用程序在我的开发机器上运行良好 C 代码完全遵循以下格式 CodeP
  • C# 中 value 为匿名类型的字典

    是否可以在 C 中创建一个System Collections Generic Dictionary
  • flowlayoutpanel和水平滚动条问题

    我正在使用一个 flowlayoutpanel 它有很多逻辑上的按钮 我遇到的问题是 当我调整窗口大小时 当窗口变小时 我无法看到所有水平排列的按钮 相反 当窗口变小时 按钮会下降到下一行 谁能帮我解决这个问题 我只是希望按钮水平排列 当窗
  • 驱蚊程序?

    不 我认真的 最近 我读到 当电脑的压电蜂鸣器以一定频率振动时 声音可以驱赶蚊子 真的吗 如何以编程方式访问 PC 蜂鸣器 而不是扬声器 最好使用 C 我不知道有没有蚊子 但我的头疼得要命 啊啊 using System Runtime I
  • 在高负载站点中使用 PHP 的策略

    在你回答这个问题之前 我从未开发过任何足够流行的东西来达到高服务器负载 把我当作 叹气 一个刚刚登陆地球的外星人 尽管我了解 PHP 和一些优化技术 我正在开发一个工具PHP如果效果好的话 可以吸引相当多的用户 然而 虽然我完全有能力开发该
  • 变形:Opencv 使用 Visual Studio 将图像显示到曲面屏幕

    我正在尝试使用 opencv API 来扭曲图像 以便将其显示到曲面屏幕上 我已经浏览了opencv中提供的翘曲apihere http docs opencv org 2 4 modules stitching doc warpers h
  • 给出对象的指针作为参数

    假设我有 void func foo obj 我有 foo object 我该如何制作object进入争论func 只需取消引用它即可 func object
  • Parallel ForEach 的本地初始化如何工作?

    我不确定 Parallel ForEach 中本地 init 函数的使用 如 msdn 文章中所述 http msdn microsoft com en us library dd997393 aspx http msdn microsof
  • 创建 PING 程序时限制 ICMP 回显答复

    我正在编写一个多线程 ping 程序 我在每个线程 针对每个 IP 上创建了原始套接字 并使用 sendto 向每个线程发送了 ICMP Echo 请求 然后在每个线程中执行了 receivevfrom 我正在从各种套接字中的 IP 获取消
  • 为什么泛型 IList<> 不继承非泛型 IList

    IList
  • 如何从 MongoDB 中的 ChangeStream 过滤对特定字段的更新

    我正在设置一个 ChangeStream 以便在集合中的文档发生更改时通知我 以便我可以将该文档的 LastModified 元素更新插入到事件发生的时间 由于此更新将导致 ChangeStream 上发生新事件 因此我需要过滤掉这些更新以
  • BlueZ D-Bus C,应用 BLE

    我正在尝试编写一个应用程序来搜索附近的蓝牙设备并与它们通信 我的应用程序将用 C 语言编写 并打算在 Linux 下工作 是否有通过 C 中的 D Bus 使用 BlueZ 的教程或示例 此应用程序的目的是从 BLE 中的文件发送数据 你能
  • 为什么 istream/ostream 慢

    于 50 40http channel9 msdn com Events GoingNative 2013 Writing Quick Code in Cpp Quickly http channel9 msdn com Events Go
  • 实例着色器矩阵的设置

    我想绘制实例立方体 我可以打电话GL DrawArraysInstanced PrimitiveType Triangles 0 36 2 成功地 我的问题是所有立方体都绘制在相同的位置和相同的旋转 我如何为每个立方体单独更改它 要创建不同
  • 如何设置扬声器声音增强设置

    如何以编程方式设置 Windows 扬声器设置 增强 选项卡 中可用的声音效果 恐怕这是不可能的 参见 Maurits 对他的评论blog http blogs msdn com b matthew van eerde archive 20
  • C++ 从文件中读取字符串

    我试图将字符串直接存储到一个文件中 以便稍后在 C 中读取 基本上 对于整个范围 我试图将带有字符串变量的对象数组存储在文件中 并且这些字符串变量将通过类似 object 的内容读取 0 字符串 然而 每次我尝试读取字符串变量时 系统都会给
  • 警告从 lambda 返回捕获的引用

    我尝试使用 lambda 有条件地将引用绑定到两个变量之一 int foo bar int choice gt int if true some condition return foo else return bar 这会在 clang
  • 在 C++11 中设置 std::thread 优先级的可移植方法

    在后 C 11 世界中设置 std thread 实例的优先级的正确方法是什么 是否有一种至少在 Windows 和 POSIX Linux 环境中有效的可移植方法 或者是获取句柄并使用可用于特定操作系统的任何本机调用的问题 无法通过 C

随机推荐

  • 如何获取特定页面的所有 Facebook 签到?

    我有一个 Facebook 页面 它也是 FB 中的一个位置 因此用户可以签到该位置 例如使用 iPhone 现在我想从我的页面获取所有签入的用户 但即使有多个用户签入 我总是得到一个空数组 我使用 Graph API 中的以下 URI h
  • 确定 T-SQL 中的时区偏移

    我的数据库应用程序将部署在不同时区的多个站点 我需要一个 T SQL 函数来确定当年 1 月 1 日午夜的 UTC 时间戳 以进行 YTD 计算 所有数据都存储在 UTC 时间戳中 例如 芝加哥采用 UTC 6 夏令时 DST 如果该函数在
  • CURL 不编码 UTF-8

    我在用着Windows 10 and 卷曲7 52 1 当我尝试POST数据到 WEBSERVICE curl没有将字符编码为UTF 8 我需要显示pt BR字符 例如 etc 是的 我已经检查过this 没有成功 如果我将编码页面设置为c
  • Gradle 无法解析 Android Studio 中的库

    我想在 Android Studio 中包含一个库 但它显示如下错误 无法解析 com lemonlab expandable button menu 1 0 0 如何解决这个问题 apply plugin com android appl
  • 带有模板参数的 C++0x lambda? [复制]

    这个问题在这里已经有答案了 可能的重复 lambda 函数可以模板化吗 是否可以使用带有模板参数的 c 0x lambda 例如 template
  • 为 Linux 安装 Anaconda [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在尝试安装适用于 Linux 的 Anaconda Linux Mint 17 2 Rafaela 14 04 3 LTS Trusty Tahr 我看到一条警告 警告 机器似乎
  • 如果我的 url 包含路由参数,则哈希链接会以角度重新路由

    如果我有一个一级路由 那么哈希链接将按预期工作 无需重新路由 但是 我有一些国家 kh 的网址 如果我尝试使用诸如国家 kh projects 之类的哈希标签 页面会重新路由 这非常烦人 因此 如果我在页面国家 地区并单击链接 develo
  • 如果没有连续的内存空间,realloc 会做什么?

    realloc用于动态重新分配内存 假设我已经使用分配了 7 个字节malloc函数 现在我想将其扩展到 30 个字节 如果内存中没有30字节的连续 单行连续 空间 后台会发生什么 是否有任何错误或者内存是否会被分段分配 realloc幕后
  • MS Visual Studio 2010如何使用.asm生成的文件

    我想询问一些我想尝试使用 Visual Studio 2010 的事情 我通过在项目属性 gt C C gt 输出文件 FAs 中将选项设置为 汇编器输出 从 cpp 文件生成 asm 文件 我的问题是 下一步如何使用 asm 生成的文件从
  • 子类 UITableViewCell 中的 UIButton 需要调用父类的方法

    很抱歉 如果答案已经存在 但我找不到 我有以下设置 MainViewController 它有一个大的 UITableView 和 CustomTableViewCell 它是 UITableViewCell 的子类 CustomTable
  • 无法创建多可用区 Aurora RDS 实例

    当我恢复 MySQL 快照时 我可以选择将新实例设置为多可用区 但是 由于某种原因 当我恢复到 Aurora 时 多可用区部署 选择被禁用 我想这可能意味着它会自动启用 但是 当我转到正在运行的实例详细信息时 它特别列出了多可用区 否 我有
  • 检查核心数据中是否设置了属性?

    如何检查核心数据对象中是否设置了属性 我将所有核心数据对象加载到目录中 var formQuestions Questions 我的核心数据 NSManagementObject 是 NSManaged var noticeText Str
  • 如何在 this.props.children 中访问 React 对象的类名

    在一个 React 组件渲染方法中 在 this props children 中有一些子组件 如何获取每个子组件的组件 类 名称以区分它们 React Children map this props children function c
  • 将 .DLL 转换为 .SO

    你们中的任何人都可以帮我将 Windows dll 文件转换为 so 文件吗 您可以尝试将 dll 的源代码重新编译为共享对象 This在确保代码确实可移植后 可能会帮助您入门 Edit Here is 还有另一个链接它可以帮助指导您完成使
  • Xcode 正在 OS X 对象而不是 iOS 对象中加载

    我有一个 iOS 窗口应用程序 直到今天它都可以与 Xcode 正常运行 当我在对象库中打开项目时 它似乎加载了所有 OS X 开发对象 并且我再也看不到任何可可触摸项目 如 UITextViews 等 我没有手动更改任何设置 所以我不确定
  • 如何更改现有表以在 Oracle 中创建范围分区

    我现有的表包含 10 年的数据 我已转储 我想在表中的一个日期键列上对现有表进行范围分区 我看到的大多数例子都是CREATE TABLE PARTITION BY RANGE 添加新分区 但我的表是现有的表 我想我需要一些ALTER陈述 A
  • 如何在 C++ 中声明原子向量

    我打算声明一个原子变量向量 用作多线程程序中的计数器 这是我尝试过的 include
  • 在曲线边缘绘制箭头

    灵感来自这个问题在 Ask sagemath 什么是best将箭头添加到生成的曲线末尾的方法Plot ContourPlot ETC 这些是高中时看到的绘图类型 表明曲线从页面末尾继续延伸 经过一番搜索 我找不到内置的方法或最新的包来执行此
  • std::launder 如何影响容器?

    考虑以下固定大小向量的简化且不完整的实现 template
  • Find() 与 FirstOrDefault() 的性能[重复]

    这个问题在这里已经有答案了 类似问题 Find 与Where FirstOrDefault 在具有单个字符串属性的简单引用类型的大序列中搜索 Diana 得到了一个有趣的结果 using System using System Collec