经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
为什么不推荐使用Linq?
来源:cnblogs  作者:VAllen  时间:2024/6/26 8:53:28  对本文有异议

相信很多.NETer看了标题,都会忍不住好奇,点进来看看,并且顺便准备要喷作者!

这里,首先要申明一下,作者本人也非常喜欢Linq,也在各个项目中常用Linq。

我爱Linq,Linq优雅万岁!!!(PS:顺便吐槽一下,隔壁Java从8.0版本推出的Streams API,抄了个四不像,一点都不优雅,而且很难用。)?

正文

不罗嗦,就一句话:“在性能敏感型应用和追求零内存分配场景不推荐使用Linq!

让我们用Benchmark结果来说话!!!

这里用一个简单的场景来验证:

  1. 拆分一个String字符串为String[]数组。
  2. 转换数组中的每个String字符串为?Int32数值。
  3. 对这些数值求和?。

让我们通过BenchmarkDotNet运行性能测试,看看用Linq和不用Linq,这两者之间的性能差异?。

Benchmark代码:

  1. internal class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. BenchmarkRunner.Run<LinqTest>();
  6. Console.ReadKey();
  7. }
  8. }
  9. ?
  10. [MemoryDiagnoser, MemoryRandomization]
  11. public class LinqTest
  12. {
  13. private static readonly string _row = "1,2,3,4,5,6,7,8,9,10";
  14. ?
  15. [Benchmark]
  16. public void SumUsingLinq()
  17. {
  18. int sum = _row.Split(',').Select(int.Parse).Sum();
  19. }
  20. ?
  21. [Benchmark(Baseline = true)]
  22. public void SumUsingForLoop()
  23. {
  24. var rowSpan = _row.AsSpan();
  25. int sum = 0;
  26. for (int i = 0; i < rowSpan.Length; i++)
  27. {
  28. if (rowSpan[i] == ',')
  29. {
  30. sum += int.Parse(rowSpan.Slice(0, i));
  31. rowSpan = rowSpan.Slice(i + 1);
  32. i = 0;
  33. }
  34. }
  35. }
  36. }

Benchmark结果:

从结果中,我们可以看到,不使用Linq的SumUsingForLoop方法,Mean平均值 75.09 ns,Allocated 无;
反观使用了Linq的SumUsingLinq方法,Mean平均值 270.18 ns,Allocated 400 B;
两者之间有约3.5倍的性能差距,而内存分配表现方面也是不使用Linq的占优。

总结:
对于追求 零内存分配(zero-copy)目标 或者 速度敏感型应用,这两种场景,都应该?慎用Linq。因为Linq扩展方法里有大量的判断,甚至还有很多内部对象的创建和内存开销。

PS: 想要坚持写技术文章、写博客、写公众号,真的很难。

原文链接:https://www.cnblogs.com/VAllen/p/18268012/why-not-recommend-using-linq

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号