1

我想知道如果 C# 是性能杀手,为什么 C# 会提供 lambda 表达式?

尝试运行以下命令:

Stopwatch sw = new Stopwatch();
 sw.Start();
 x = x.Select((int i) => i += 1).ToArray();
 sw.Stop();
 Console.WriteLine(sw.ElapsedTicks);

Stopwatch sw = new Stopwatch();
sw.Start();
for (int j = 0; j < 1000; j++) y[j] += 1;
sw.Stop();
Console.WriteLine(sw.ElapsedTicks);

对于 x = 1000,我们会发现巨大的差异。

lambda 有合适的用例吗?

4

3 回答 3

8

您使用 lambda 表达式的代码将x其所有 1000 个元素获取并复制到一个新数组中,为它们的所有 1000 个值计算新值。这显然比就地修改同一个数组中的 1000 个现有元素更昂贵。

怎么做才对!

简单:将 LINQ 和委托用于正确的目的。我不会使用 LINQ 来获取一组数字并递增其所有值。

仅仅因为 C# 提供了 lambda(它们实际上是委托和表达式树的语法糖),并不意味着您必须将它们用于所有事情。如果您将它们用于正确的目的,您会注意到它们不会对性能造成任何实际影响,至少不会像您所观察到的那样令人震惊。

于 2012-05-27T07:52:17.237 回答
1

我想我们必须记住 LINQ 是一种用于查询的语言。当然,你也可以用它做其他事情,比如更新一个集合(一个在 SO 上经常被问到的方法)或运行一个循环,但你为什么要这样做呢?LINQ 和 lambda 表达式并不是过程式编程的全新的完全替代品,它只是一个可以在合适的时候使用的工具。
与其他查询语言(例如 t-sql)一样,LINQ 为您提供工具来定义您想要获取的内容,而不是您想要获取的方式,这还允许您创建一种语言独立的查询,您可以稍后使用解析为任何你想要的。在许多情况下使用它可能非常方便和通用,并且还可以抽象底层数据类型/数据源,但这也意味着您将 HOW 的具体实现留给为您的查询编写解析器的人.
我建议您阅读那里的一些示例 linq 提供程序。以 LINQ to LDAP 为例:作为开发人员,此类提供程序允许您只专注于您想要的数据,而不是底层数据结构/Active Directory API,后者使用起来可能很烦人。
与您获得的所有其他工具一样,您需要问自己想要获得什么,以及该工具是否是最好的方法。一个很好的类比是在 sql servre 查询中使用循环;当然,它可以完成,但您通常更喜欢构建一个选择,让 sql 引擎决定如何执行您的查询。

于 2012-05-27T09:27:11.270 回答
0

如果 C# 是性能杀手,为什么 C# 会提供 lambda 表达式?

因为与可读代码的重要性相比,性能通常并不重要。

于 2012-05-27T10:24:32.053 回答