lambda 函数比委托/匿名函数更快吗?

2024-03-09

我以为lambda functions, delegates and anonymous functions具有相同的主体将具有相同的“速度”,但是,运行以下简单的程序:

static void Main(string[] args)
{
    List<int> items = new List<int>();

    Random random = new Random();

    for (int i = 0; i < 10000000; i++)
    {
        items.Add(random.Next());
    }

    Stopwatch watch;
    IEnumerable<int> result;

    Func<int, bool> @delegate = delegate(int i)
    {
        return i < 500;
    };
    watch = Stopwatch.StartNew();
    result = items.Where(@delegate);
    watch.Stop();
    Console.WriteLine("Delegate: {0}", watch.Elapsed.TotalMilliseconds);

    Func<int, bool> lambda = i => i < 500;
    watch = Stopwatch.StartNew();
    result = items.Where(lambda);
    watch.Stop();
    Console.WriteLine("Lambda: {0}", watch.Elapsed.TotalMilliseconds);

    watch = Stopwatch.StartNew();
    result = items.Where(i => i < 500);
    watch.Stop();
    Console.WriteLine("Inline: {0}", watch.Elapsed.TotalMilliseconds);

    Console.ReadLine();
}

I get:

代表:4.2948 毫秒

拉姆达:0.0019 毫秒

匿名:0.0034 毫秒

尽管可以忽略不计,但为什么这三种看似相同的方法以不同的速度运行?幕后发生了什么?


Update:

正如评论所建议的,以下“强制”Where通过致电ToList()在上面。此外,还添加了一个循环以提供更多运行数据:

while (true) 
{
    List<int> items = new List<int>();

    Random random = new Random();

    for (int i = 0; i < 10000000; i++)
    {
        items.Add(random.Next());
    }

    Stopwatch watch;
    IEnumerable<int> result;

    Func<int, bool> @delegate = delegate(int i)
    {
        return i < 500;
    };
    watch = Stopwatch.StartNew();
    result = items.Where(@delegate).ToList();
    watch.Stop();
    Console.WriteLine("Delegate: {0}", watch.Elapsed.TotalMilliseconds);

    Func<int, bool> lambda = i => i < 500;
    watch = Stopwatch.StartNew();
    result = items.Where(lambda).ToList();
    watch.Stop();
    Console.WriteLine("Lambda: {0}", watch.Elapsed.TotalMilliseconds);

    watch = Stopwatch.StartNew();
    result = items.Where(i => i < 500).ToList();
    watch.Stop();
    Console.WriteLine("Inline: {0}", watch.Elapsed.TotalMilliseconds);
    Console.WriteLine(new string('-', 12));

}

上述代码的结果是每个函数大约需要 120 毫秒。


其他人的结果表明性能是相同的:

http://blogs.microsoft.co.il/blogs/alex_golesh/archive/2007/12/11/anonymous-delegates-vs-lambda-expressions-vs-function-calls-performance.aspx http://blogs.microsoft.co.il/blogs/alex_golesh/archive/2007/12/11/anonymous-delegates-vs-lambda-expressions-vs-function-calls-performance.aspx

正如评论中指出的,微基准常常具有误导性。有太多你无法控制的因素,JIT 优化、垃圾收集周期等等......

请参阅这个相关问题:

何时不使用 lambda 表达式 https://stackoverflow.com/questions/672918/when-not-to-use-lambda-expressions

最后,我认为你的测试从根本上来说是有缺陷的!您使用 LinqWhere扩展方法来执行您的代码。然而,Linq 使用惰性求值,只有当您开始迭代结果时,您的代码才会被执行!

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

lambda 函数比委托/匿名函数更快吗? 的相关文章

  • 将集合绑定到自定义控件属性

    我没有运气尝试将数据集合绑定到我的自定义控件的属性 我已经实现了该控件的字符串属性的机制 在此处提供了一些帮助 并期望集合类型同样简单 但是我无法让它再次工作 这是我的自定义控件视图
  • 数据模板绑定垃圾邮件输出窗口出现错误:找不到管理 FrameworkElemen

    我有问题 System Windows Data 错误 2 找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement BindingExpression 无路径 数据项 空 目标元素是 So
  • QCombobox 向下箭头图像

    如何更改Qcombobox向下箭头图像 现在我正在使用这个 QSS 代码 但这不起作用 我无法删除向下箭头边框 QComboBox border 0px QComboBox down arrow border 0px background
  • 在实体框架拦截器中向 DbScanExpression 添加内部联接

    我正在尝试使用实体框架 CommandTree 拦截器通过 DbContext 向每个查询添加过滤器 为了简单起见 我有两个表 一个称为 User 有两列 UserId 和 EmailAddress 另一个称为 TenantUser 有两列
  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 指向特征矩阵的指针数组

    我在代码中使用 Eigen 的 MatrixXd 矩阵 在某个时刻我需要一个 3D 矩阵 由于 Eigen 没有三维矩阵类型 因为它仅针对线性代数进行了优化 因此我创建了一个 MatrixXd 类型的指针数组 Eigen MatrixXd
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 如何从文本文件读取整数到数组

    这就是我想做的 我对此有些不满 但我希望你能容忍我 这对我来说是一个非常新的概念 1 在我的程序中 我希望创建一个包含 50 个整数的数组来保存来自文件的数据 我的程序必须获取用户的文档文件夹的路径 2 文件的名称为 grades txt
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • 将二进制数据从 C# 上传到 PHP

    我想将文件从 Windows C 应用程序上传到运行 PHP 的 Web 服务器 我知道 WebClient UploadFile 方法 但我希望能够分块上传文件 以便我可以监控进度并能够暂停 恢复 因此 我正在读取文件的一部分并使用 We
  • 无法在内存位置找到异常源:cudaError_enum

    我正在尝试确定 Microsoft C 异常的来源 test fft exe 中 0x770ab9bc 处的第一次机会异常 Microsoft C 异常 内存位置 0x016cf234 处的 cudaError enum 我的构建环境是 I
  • 运行选定的代码生成器时出错:“未将对象引用设置到对象的实例。”错误?

    我已经尝试了所有解决方案 例如修复 VS 2013 但没有用 当您通过右键单击控制器文件夹来创建控制器并添加控制器时 然后右键单击新创建的控制器的操作并选择添加视图 当我尝试创建视图时 就会发生这种情况 它不是一个新项目 而是一个现有项目
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • 我可以让 ungetc 取消阻止阻塞的 fgetc 调用吗?

    我想在收到 SIGUSR1 后使用 ungetc 将 A 字符重新填充到标准输入中 想象一下我有充分的理由这样做 调用 foo 时 stdin 中的阻塞读取不会被收到信号时的 ungetc 调用中断 虽然我没想到它会按原样工作 但我想知道是
  • 在简单注入器中解析具有自定义参数的类

    我正在使用以下命令创建 WPF MVVM 应用程序简易注射器作为 DI 容器 现在 当我尝试从简单注入器解析视图时遇到一些问题 因为我需要在构造时将参数传递到构造函数中 而不是在将视图注册到容器时 因此这不是适用的 简单注入器将值传递到构造
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo
  • 从 JavaScript 中的 OnClientClick 事件中阻止 C# 中的 asp:Button OnClick 事件?

    我有一个asp Button在我的网页上 它调用 JavaScript 函数和代码隐藏方法 后者进行调用以导航到另一个页面 在 JavaScript 函数中 我正在检查条件 如果不满足这个条件 我想中止导航 以便OnClick方法未被调用

随机推荐

  • 以极高的精度计算小数?

    出于好奇 我正在编写一个小型 JavaScript 程序来估计数字的值e 由系列 1 n 给出从零到无穷大 问题是 由于 IEEE 754 标准 无论我评估多少个术语 我的答案都会四舍五入到小数点后 16 位 有没有一种方法可以在值达到不考
  • 使用 java 创建快速/可靠的基准测试?

    我正在尝试使用 java 创建基准测试 目前我有以下简单的方法 public static long runTest int times long start System nanoTime String str str for int i
  • 线程环境中的 Clojure 全局变量行为

    鉴于这按我的预期工作 do println resolve a nil def a a println resolve a user a 我想了解为什么这不会 future println resolve b user b shouldn
  • 球互相弹开

    我正在编写这个脚本 其中画布中有 x 个弹跳球 在本例中为 20 个球 我的问题是 如何让它们在撞击时相互弹开 以及在撞击黄色矩形时弹开 var mycanvas document getElementById mycanvas var c
  • 使用 libav 转换 mp4-ts

    我正在尝试使用将 mp4 文件转换为 mpegtslibav 该代码可以工作 但输出的文件无法被任何播放器播放 这里是输入文件 http yt dash mse test commondatastorage googleapis com m
  • 单击按钮后克隆整个表单元素

    我有以下表格
  • 没有.net库的图像裁剪C#

    谁能建议如何裁剪图像 例如 jpeg 而不使用任何 NET 框架结构 仅使用原始字节 因为这是 Silverlight 中唯一 的方法 或者指向一个图书馆 我不关心渲染 我想在上传之前操作 jpg Silverlight 中没有可用的 GD
  • 无法链接到 XCode9 中的插座集合

    我有一些在动画期间随机播放的限制 升级到 XCode9 后 我尝试进行一些调整 编辑器似乎不再允许我向约束集合 IBOutlet 添加约束 我什至创建了一个新项目并尝试制作一个简单的插座系列 但遇到了同样的问题 这是我正在谈论的内容的简短视
  • 删除 PayPal Express Checkout 中的送货地址选项

    我用的是JSscript https developer paypal com docs integration direct express checkout integration jsv4 basic integration 贝宝推荐
  • Google 可以使用邮政信箱自动填写地址表单吗?

    我正在购物车中的结账表单上使用 地点 自动完成功能 参见示例 https developers google com maps documentation javascript examples places autocomplete ad
  • 在Python中使用队列进行线程处理

    我想在 python 中使用线程来下载大量网页 并浏览了以下在其中一个网站中使用队列的代码 它放置了一个无限的 while 循环 每个线程是否连续运行 直到所有线程都完成为止 我是不是错过了什么 usr bin env python imp
  • mongo集合中的数据碎片

    我在一个 mongo 集合中有很多更新 并假设此后文件系统上存在巨大碎片 我主要担心的是 集合将在文件系统上不断增长 而集合 中的数据却没有有价值的增长 您能否证实或反驳我的担忧 这取决于您要进行哪种更新 如果这些更新增加了您的文档 数组推
  • 对于同一 .NET 库的不同目标框架构建,程序集 GUID 属性是否应该有所不同?

    我正在用 C 开发一个 NET 库 它必须解决一系列广泛的目标框架 我想生成一个 nuget 包 它可以根据目标项目的设置正确安装 为了实现这一目标 我使用多个 csproj 文件 它们中的每一个都针对特定的目标框架 例如 MyLibrar
  • 程序集未加载 C#

    我有一个项目Common其中包含一个 log4net CustomAppender 我在所有其他项目中引用该项目并在中配置 log4net 附加程序app config 一切都很顺利 除了一个项目在尝试实例化 Appender 时失败了 输
  • 如何在java中更新文本文件的某些部分

    我希望能够更新文本文件中的某一行 但我收到错误 无法删除该文件 为什么会收到此错误 public class Main public static void main String args Main rlf new Main rlf re
  • Pandas GroupBy 和计算 Z 分数 [重复]

    这个问题在这里已经有答案了 所以我有一个如下所示的数据框 pd DataFrame 1 10 14 1 12 14 1 20 12 1 25 12 2 18 12 2 30 14 2 4 12 2 10 14 columns A B C A
  • 如何在 Pygame 中显示精灵?

    这只是一个关于 PyGame 中精灵的简单问题 我按照下面的代码加载了图像 我只是想知道如何在 PyGame 中显示精灵 例如绘制矩形或圆形 无论如何 我不想让它表现得如此 我想我用一个blit命令 但我不确定并且我在网上没有找到太多信息
  • 多线程环境登录并测试

    请让我知道您在以下场景中如何设计日志记录以及如何测试日志记录的建议 我有一个可以由多个线程调用的 API 单个线程对该 API 的一次调用会生成 50 KB 的日志 是否存在用于在多线程环境中进行日志记录的设计模式 IE所有线程使用一个日志
  • 如何在 Kotlin 中手动将字节分配给 long?

    我正在尝试做这样的事情Kotlin val top Long 1000000 1000000 1000000 1000000 1000000 1000000 1000000 In Java它看起来像这样 long TOP 1000000 1
  • lambda 函数比委托/匿名函数更快吗?

    我以为lambda functions delegates and anonymous functions具有相同的主体将具有相同的 速度 但是 运行以下简单的程序 static void Main string args List