为什么不推荐使用Linq?

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

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

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

正文

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

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

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

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

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

Benchmark代码:

csharp 复制代码
internal class Program
{
    static void Main(string[] args)
    {
        BenchmarkRunner.Run<LinqTest>();
        Console.ReadKey();
    }
}
​
[MemoryDiagnoser, MemoryRandomization]
public class LinqTest
{
    private static readonly string _row = "1,2,3,4,5,6,7,8,9,10";
​
    [Benchmark]
    public void SumUsingLinq()
    {
        int sum = _row.Split(',').Select(int.Parse).Sum();
    }
​
    [Benchmark(Baseline = true)]
    public void SumUsingForLoop()
    {
        var rowSpan = _row.AsSpan();
        int sum = 0;
        for (int i = 0; i < rowSpan.Length; i++)
        {
            if (rowSpan[i] == ',')
            {
                sum += int.Parse(rowSpan.Slice(0, i));
                rowSpan = rowSpan.Slice(i + 1);
                i = 0;
            }
        }
    }
}

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: 想要坚持写技术文章、写博客、写公众号,真的很难。

相关推荐
计算机毕设定制辅导-无忧学长8 小时前
Kafka 核心架构与消息模型深度解析(二)
架构·kafka·linq
小马哥编程1 天前
【ISAQB大纲解读】Kafka消息总线被视为“自下而上设计”?
分布式·kafka·系统架构·linq
TDengine (老段)3 天前
TDengine 高级功能——流计算
大数据·物联网·flink·linq·时序数据库·tdengine·涛思数据
shangjg35 天前
Kafka 如何保证顺序消费
c#·linq
stormsha8 天前
深入解析Kafka JVM堆内存:优化策略与监控实践
jvm·缓存·kafka·linq
CopyLower8 天前
设计一个支持100,000 QPS的评论中台系统架构:技术实践与实现指南
系统架构·c#·linq
coredx8 天前
如何在 .NET 中构建一个好用的动态查询生成器
c#·.net·linq·ef core·表达式树
vvilkim8 天前
深入理解C#中的LINQ:数据查询的终极利器
开发语言·c#·linq
Apache Flink8 天前
基于 Flink+Paimon+Hologres 搭建淘天集团湖仓一体数据链路
大数据·flink·linq
NON-JUDGMENTAL9 天前
使用 PySpark 从 Kafka 读取数据流并处理为表
分布式·kafka·linq