我想知道为什么C#会提供lambda表达式,如果它是性能杀手?
尝试运行以下内容:
Stopwatch sw = new Stopwatch();
sw.Start();
x = x.Select((int i) => i += 1).ToArray();
sw.Stop();
Console.WriteLine(sw.ElapsedTicks);
AND
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用例?
答案 0 :(得分:8)
使用lambda表达式的代码需要x
并将其所有1000个元素复制到一个新数组中,为其所有1000个值计算新值。显然,这比仅仅修改同一阵列中的1000个现有元素要贵得多。
怎么做对了!
简单:使用LINQ和代表以达到正确的目的。取一个数字并递增所有值不是我会使用LINQ for。
仅仅因为C#提供了lambda(这对于委托和表达式树来说真的是语法糖),并不意味着你必须将它们用于所有事情。如果你出于正确的目的使用它们,你会注意到它们不会产生任何真正的性能命中,至少不会像你观察到的那样严重。
答案 1 :(得分:1)
我认为我们必须记住LINQ是QUERIES的一种语言。当然,你也可以用它做其他的事情,比如更新一个集合(如何在SO上经常询问)或运行一个循环,但你为什么要这样做呢? LINQ和lambda表达式不是程序编程的全新替换,它只是一个可以在适当时使用的工具。
与其他查询语言(例如t-sql)一样,LINQ为您提供了定义您想要获取的内容的工具,而不是您希望如何获取它,这也允许您创建一种语言 - 独立的查询,您可以在以后使用解析你想要的任何东西。在许多情况下使用它可能非常方便和通用,也可以抽象底层数据类型/数据源,但它也意味着你留下HOW的具体实现,以便让你知道为你的查询编写解析器的人。
我建议你阅读一些样本linq提供者。以LINQ to LDAP为例:这样的提供程序允许您作为开发人员,只关注您想要的数据,而不是基础数据结构/ Active Directory API,这可能非常烦人。
与您获得的其他工具一样,您需要问自己想要获得什么,以及此工具是否是最好的方法。一个很好的比喻就是在sql servre查询中使用循环;当然,它可以完成,但你通常更喜欢构建一个select,它将让sql引擎决定如何执行你的查询。
答案 2 :(得分:0)
如果它是性能杀手,为什么C#会提供lambda表达式?
与可读代码的重要性相比,性能通常并不那么重要。