为什么不推荐使用Linq?
相信很多.NETer看了标题,都会忍不住好奇,点进来看看,并且顺便准备要喷作者!
这里,首先要申明一下,作者本人也非常喜欢Linq,也在各个项目中常用Linq。
我爱Linq,Linq优雅万岁!!!(PS:顺便吐槽一下,隔壁Java从8.0版本推出的Streams API,抄了个四不像,一点都不优雅,而且很难用。
)
正文
不罗嗦,就一句话:“在性能敏感型应用和追求零内存分配场景不推荐使用Linq!
”
让我们用Benchmark结果来说话!!!
这里用一个简单的场景来验证:
- 拆分一个String字符串为String[]数组。
- 转换数组中的每个String字符串为Int32数值。
- 对这些数值求和。
让我们通过BenchmarkDotNet运行性能测试,看看用Linq和不用Linq,这两者之间的性能差异。
Benchmark代码:
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结果:
总结:
对于追求 零内存分配(zero-copy)目标 或者 速度敏感型应用,这两种场景,都应该慎用Linq。因为Linq扩展方法里有大量的判断,甚至还有很多内部对象的创建和内存开销。
PS: 想要坚持写技术文章、写博客、写公众号,真的很难。
为什么不推荐使用Linq?的更多相关文章
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- LINQ实现递归算法
LINQ的使代码更加整洁,但往常递归都会需要定义两个方法,如果使用Razor语法书写递归就会变得无从下手.所以推荐使用LINQ实现递归 @{ //统计名片认证数量 ; Func<int, int ...
- [.net 面向对象编程基础] (20) LINQ使用
[.net 面向对象编程基础] (20) LINQ使用 通过上节LINQ的基础知识的学习,我们可以开始使用LINQ来进行内存数据的查询了,我们上节说了LINQ的定义为:Language Integr ...
- LINQ简介和LINQ to SQL语句之Where
LINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性.已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感 ...
- LINQ to SQL语句之Join和Order By
Join操作 适用场景:在我们表关系中有一对一关系,一对多关系,多对多关系等.对各个表之间的关系,就用这些实现对多个表的操作. 说明:在Join操作中,分别为Join(Join查询), SelectM ...
- LINQ(LINQ to Entities)
LINQ to Entities 是 LINQ 中最吸引人的部分.它让你可以使用标准的 C# 对象与数据库的结构和数据打交道.使用 LINQ to Entities 时,LINQ 查询在后台转换为 S ...
- C#_LINQ(LINQ to Entities)
LINQ to Entities 是 LINQ 中最吸引人的部分.它让你可以使用标准的 C# 对象与数据库的结构和数据打交道.使用 LINQ to Entities 时,LINQ 查询在后台转换为 S ...
- LINQ实战
转载:http://www.cnblogs.com/yubinfeng/p/4567064.html 原作者:尼古拉斯~yu 文章部分内容在原文的基础上有删改. 我相信在net进阶的这个阶段,很 ...
- 为什么LINQ to XML的性能要优于XmlDocument?
一直很忙,压了很多贴,今天发一篇吧.后面的看心情吧. 今天群里有人问如何解析web.config方便,然后我就推荐了Linq to XML,然后就有人说“我宁可XmlDocument,再SeleteN ...
- Linq(一)
概述 LINQ是.NET框架的扩展,它允许我们以使用SQL查询数据库的方式来查询数据集合. 使用LINQ,你可以从数据库.程序对象集合以及XML文档中查询数据. 需要注意的是,对于比较简单的功能,与其 ...
随机推荐
- MQTT GUI 客户端 可视化管理工具
MQTT GUI 客户端 可视化管理工具 介绍 多标签页管理,同时打开多个连接 提供原生性能,并且比使用 Electron 等 Web 技术开发的同等应用程序消耗的资源少得多 支持 MQTT v5.0 ...
- 深入理解Python协程:从基础到实战
title: 深入理解Python协程:从基础到实战 date: 2024/4/27 16:48:43 updated: 2024/4/27 16:48:43 categories: 后端开发 tag ...
- 大模型_2.1:Prompt进阶
目录: 1.Prompt frameWork 2.Prompt 结构化格式 3.如何写好结构化 Prompt ? 4.Zero-Shot Prompts 5.Few-Shot Prompting 6. ...
- list转json tree的工具类
package com.glodon.safety.contingency.job; import com.alibaba.fastjson.JSON; import com.alibaba.fast ...
- SQL——连续出现的数字
SQL三个排序函数 ROW_NUMBER().RANK().DENSE_RANK() ROW_NUMBER()不并列 连续的 RANK()分组不连续排序(跳跃排序) DENSE_RANK()并列连续 ...
- 说一下flex的属性
flex-grow项目的放大比例,默认为0,即如果存在剩余空间,也不放大. flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小.负值对该属性无效. flex-bas ...
- 【C#】 封装的异步HttpRequest
private async void btn_userLogin_Click(object sender, EventArgs e) { UInfo = new ...
- MKV与MatroskaExtractor
mkv封装格式相关内容可以参考:MKV 文件格式解析_Martyn哥的博客-CSDN博客_mkv 格式解析 本篇主要是用来记录MatroskaExtractor是如何解析EBML的,如何解析EBML ...
- NOIP模拟65
T1 网格图 解题思路 60pts 就是个zz做法..(我考场上造了一个 \(500\times 500\) 的 X,一看挺快,就以为 \(n^4\) 可以切,然而..) 正解有一点难度,对于每一个节 ...
- win10离线安装.net3.5失败的解决方案
简介: 问题:有时候需要离线安装.net3.5环境,网上的教程一般都是通过NetFx3.cab进行离线安装,但有时候会出现离线安装失败,比如: by~MaQaQ 2024-06-04 分析: 1.先关 ...