抖音技术能力大揭密!钜惠大礼、深度体验,尽在火山引擎增长沙龙,就等你来! 立即报名>> 了解详情
写点什么

Lambda 表达式的性能问题

2007 年 7 月 05 日

《LINQ Cookbook》的第5 个条目(拼接CheckedListBox 中选中的字符串)中,微软公司Visual Basic 团队演示了分别使用两种VB 9 中的新特性来实现这类字符串连接的方法。

在第一种方法里,Visual Basic 团队使用了LINQ 的聚合(Aggregate)语法。如下述代码所示,将各个字符串用逗号连接起来:

<p>MsgBox( _<br></br> Aggregate Box In CheckedListBox1.CheckedItems _ <br></br> Into Concat()) </p>代码中的 Concat 是一个扩展方法(extension method),其实现如下:

<p>Public Module AggregateModule <br></br> Public Function Concat(Of Type)( _ <br></br> ByVal ie As IEnumerable(Of Type)) As String <br></br> Dim str As String = "" <br></br> For Each item In ie <br></br> If str <> "" Then str &= "," <br></br> str &= item.ToString() <br></br> Next <br></br> Return str <br></br> End Function <br></br>End Module </p>若不想如此麻烦地额外编写一个扩展方法,C#和 VB 开发者也可以使用 Lambda 表达式来完成同样的功能。其语法略显复杂,不过也还可以接受:

<p>MsgBox((From c In _ <br></br> CheckedListBox1.CheckedItems).Aggregate( _ <br></br> Function(ByVal x, ByVal y) x + "," + y)) </p>不过, Bill McCarthy 却指出,这种方法存在着一些问题,包括性能方面:

若是通过编写扩展方法来完成的话,我们可以借助 StringBuilder 来提高字符串拼接的效率,不过若是使用 lambda 表达式,那么又该如何使用 StringBuilder 呢?若是我们无法找到可行的解决办法,那么使用 lambda 表达式势必将在每次字符串连接的时候都要创建若干个不必要的对象副 本——我们都知道在.NET 中,这是拼接字符串操作的大忌。而在编写扩展方法时,我们则可以很容易地通过重构来引入高效的 StringBuilder 对象。

另外一个让 Bill McCarthy 担心的问题就是,lambdas 表达式的方式无法提供良好的可重用性。lambdas 表达式通常在某个函数的上下文中出现,并在函数结束 时被销毁,因此除非将其作为委托返回,否则很难实现重用。不过对于只支持单行 lambdas 表达式的 VB 来说,这不会产生太大的问题,但对于支持较长 lambdas 表达式的 C#来说,也许会出现一定问题。

查看英文原文: Performance Problems with Lambdas

2007 年 7 月 05 日 19:352192
用户头像

发布了 37 篇内容, 共 67542 次阅读, 收获喜欢 2 次。

关注

评论

发布
暂无评论
发现更多内容

2021Java春招面试真题详解,Git-如何优雅地回退代码

策划Java工程师

Java 程序员 后端

2021年五面蚂蚁,从单体到分布式,必须解决的四个问题

策划Java工程师

Java 程序员 后端

Hologres揭秘:深度解析高效率分布式查询引擎

阿里云大数据AI技术

企业安全运维重点是什么?如何做?

行云管家

数据库 运维 企业管理 企业运维 安全运维

2021Java笔试题总结!Java个人学习之旅(第十天)

策划Java工程师

Java 程序员 后端

编译脚本:编写CMakeFile(一)

正向成长

CMakeFile

基于 Apache APISIX,新浪微博API网关的定制化开发之路

Apache APISIX 中国社区

Apache 网关 APISIX 微博

面试官:你了解JVM的锁优化吗?

百度开发者中心

Java 最佳实践 方法论 语言 & 开发

FastApi-04-请求体-1

Python测试和开发

FastApi 8月日更

Python代码阅读(第2篇):数字转化成列表

Felix

Python 编程 Code Programing 阅读代码

2021Java大厂面试集合,java多线程

策划Java工程师

Java 程序员 后端

Java代码中,如何监控Mysql的binlog?

互联网架构师小马

防火墙 Keepalived 异常双活恢复后部分外网访问中断问题分析

Qunar技术沙龙

运维 防火墙 网络 故障诊断 keep-alive

2021年Java知识体系总结,部门老大:redis-分布式锁再这么用

策划Java工程师

Java 程序员 后端

Linux 网络管理技术 OSI 七层模型和 TCP/IP 四层模型

学神来啦

Linux 运维 IP

API网关在API安全性中的作用

互联网架构师小马

gitlab无法通过ssh拉代码

阿呆

#GitLab

频繁出现的分布式拒绝服务 (DDoS) 攻击​,有什么办法可以抵御吗?

九河云安全

双非本化学跨专业,投岗阿里/滴滴后端三面,最终拿下offer

编程菌

Java 编程 程序员 面试 计算机

区块链技术如何有效应对气候变化

CECBC区块链专委会

【最不佳实践】Serverless应用优化四则

刘宇

Serverless 优化

你使用的SimpleDateFormat类还安全吗?

华为云开发者社区

Java 安全 线程 高并发 SimpleDateFormat类

ironSource 在 2021 ChinaJoy 举办多场活动赋能中国开发者

Geek_459987

从河南暴雨、疫情反弹看区块链“灾疫”治理

CECBC区块链专委会

2021年Java开发实战!仿微信的网络聊天室项目开发【完整源码讲解

策划Java工程师

Java 程序员 后端

关于Spring注解开发教程,打包全送你

华为云开发者社区

Java spring 容器 注解 组件

TRTC代码示例文档集合完毕!哪里不会点哪里!

腾讯云音视频

腾讯云 API sdk 实时音视频 音视频开发

当企业遭遇分布式拒绝服务 (DDoS) 攻击时,第一时间该如何进行操作?

九河云安全

下一个颠覆的领域:区块链如何影响审计行业?(下)

CECBC区块链专委会

2021Java面经:Android屏幕适配-重点盘点

策划Java工程师

Java 程序员 后端

啃书一年多的我,推荐Python初学者不要在乱看书了,有这三本就妥妥的

冇先生

Study Go: From Zero to Hero

Study Go: From Zero to Hero

Lambda表达式的性能问题-InfoQ