2022年11月份微软推出了带有STS(标准期限支持)的.NET版本7,仅提供18个月的支持。

微软今年推出了STS版本,因为它已经在2019年提到,它将在每年11月左右发布一个新版本的.NET。

但是,考虑到新的官方.NET7功能和更新,它仍然为用户带来了大量变化和.NET7性能改进。今天给大家分享.NET 7与.NET 6之间的几个值得注意的差异如下:

一、On-stack replacement(OSR)

允许在执行过程中更改已执行的代码。我们可以对于长时间正在运行的方法在执行过程中转换到更新的版本。

堆栈替换背后的思想是,方法不仅可以在调用之间进行替换,甚至可以在它执行时进行替换,而它“在堆栈上”。

除了对0级代码进行调用计数检测外,还对循环进行迭代计数检测。当迭代超过某个限制时,JIT编译该方法的新高度优化版本,将所有本地/寄存器状态从当前调用转移到新调用,然后跳转到新方法中的适当位置。

具体可以看这篇链接的详细介绍

https://devblogs.microsoft.com/dotnet/performance_improvements_in_net_7/

二、Regex Improvements(正则改进和提升)

具体可以参考这个链接

https://devblogs.microsoft.com/dotnet/regular-expression-improvements-in-dotnet-7/

 三、Simplified LINQ Ordering 简化的LINQ排序

LINQ排序同时支持IQueryable 和 IEnumerable

看一个示例代码

var data = new[] { 2, 1, 3 };
var sorted = data.Order();
var sortedDesc = data.OrderByDescending();

四、Dynamic PGO(profile-guided optimization) Improvements 

动态PGO旨在对静态PGO进行一些关键更改。

动态PGO利用了分层编译。JIT使用0级代码来跟踪方法被调用的次数,或者在循环的情况下,跟踪循环执行的次数。它还可以将其用于其他用途。

例如,它可以精确地跟踪哪些具体类型被用作接口分派的目标,然后在第1层中专门化代码以期望最常见的类型。

启用和禁用PGO,性能差异很大。

五、Reflection Improvements(反射性能提升)

MethodBase.Invoke,通过获取一个MethodBase(例如MethodInfo)对象,该对象表示调用方先前查询的某个方法,并使用运行时需要封送至被调用方的任意参数和需要封送回的任意返回值来调用它。

性能提升了一个数量级

反射还涉及对类型、方法、属性等的对象的大量操作,在使用这些API时可能会产生明显的差异。

另外还有一个Activator.CreateInstance,它将AssemblyName的大部分底层支持从本机运行时代码转移到了CoreLib中的托管代码中。这反过来又会影响使用它的任何东西,例如当使用Activator.CreateInstance重载时,这些重载采用需要解析的程序集名称。

官方提供了一个示例代码,来测试这个方法的性能提升

private readonly string _assemblyName = typeof(MyClass).Assembly.FullName;
private readonly string _typeName = typeof(MyClass).FullName;
public class MyClass { } [Benchmark]
public object CreateInstance() => Activator.CreateInstance(_assemblyName, _typeName);

 六、Application Trimming Improvements (应用大小修剪)

修剪特定应用程序中不需要的内容,并制作一个较小的应用程序,从而提供较小的.exe。

 七、Memory Caching Improvements

内存缓存改进,这是专门针对ASP.NET的,但这是对如何进行内存缓存的改进。

 八、Minimal APIs 改进

  • 输出缓存
  • 速率限制:在您必须手动写入队列之前,现在只需速率限制您自己的应用程序,然后管理您的呼叫速率—您的依赖关系和更好的用户体验
  • 以最少的API上载文件
  • 在最少的API中改进开放API
  • 路由筛选器处理
  • 改进的依赖注入
  • ASP.NET核心的一些改进,如MVC和Blazor Pages的可空模型

还有其他很多新的特性,比如说支持TAR File创建,Blazor的升级、加解密算法等。

周国庆

2023/1/15

.NET 7新特性的更多相关文章

  1. SQL Server 2014 新特性——内存数据库

    SQL Server 2014 新特性——内存数据库 目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 ...

  2. ElasticSearch 5学习(10)——结构化查询(包括新特性)

    之前我们所有的查询都属于命令行查询,但是不利于复杂的查询,而且一般在项目开发中不使用命令行查询方式,只有在调试测试时使用简单命令行查询,但是,如果想要善用搜索,我们必须使用请求体查询(request ...

  3. [干货来袭]C#6.0新特性

    微软昨天发布了新的VS 2015 ..随之而来的还有很多很多东西... .NET新版本 ASP.NET新版本...等等..太多..实在没消化.. 分享一下也是昨天发布的新的C#6.0的部分新特性吧.. ...

  4. CSS3新特性应用之结构与布局

    一.自适应内部元素 利用width的新特性min-content实现 width新特性值介绍: fill-available,自动填充盒子模型中剩余的宽度,包含margin.padding.borde ...

  5. 【译】Meteor 新手教程:在排行榜上添加新特性

    原文:http://danneu.com/posts/6-meteor-tutorial-for-fellow-noobs-adding-features-to-the-leaderboard-dem ...

  6. 跨平台的 .NET 运行环境 Mono 3.2 新特性

    Mono 3.2 发布了,对 Mono 3.0 和 2.10 版本的支持不再继续,而且这两个分支也不再提供 bug 修复更新. Mono 3.2 主要新特性: LLVM 更新到 3.2 版本,带来更多 ...

  7. Atitit opencv版本新特性attilax总结

    Atitit opencv版本新特性attilax总结 1.1. :OpenCV 3.0 发布,史上功能最全,速度最快的版1 1.2. 应用领域2 1.3. OPENCV2.4.3改进 2.4.2就有 ...

  8. es6 新特性2

    es6其他几个非常有用的新特性. import export 这两个家伙对应的就是es6自己的module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成 ...

  9. ES6 新特性

    ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 也就是说,ES6就是ES2015. ...

  10. 谈谈我的微软特约稿:《SQL Server 2014 新特性:IO资源调控》

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 撰写经历(Experience) 特约稿正文(Content-body) 第一部分:生活中资源 ...

随机推荐

  1. 解决在JS中阻止定时器“重复”开启问题、Vue中定时器的使用

    1.问题描述 在一些需求开发中.需要设定软件提供服务的时间段(营业时间).这时可以选择定时器来实现.可以选择让定时器每隔一段时间检测当前时间是否在服务时间.到达服务时间.进入服务状态.未到服务时间.进 ...

  2. Linux 文件操作接口

    目录 Linux 文件操作接口 C语言文件操作接口 C语言文件描述 fopen() r模式打开文件 w模式打开文件 a模式打开文件 其他模式类似 fclose() fwrite() fread() 系 ...

  3. 齐博x1背景图如何设置标签

    背景图非常特殊,由于不能点击,所以他不能直接添加标签,需要添加一个辅助标签,比如类似下面的代码 {qb:hy name="xxa001" type="image" ...

  4. web3.0、比特币、区块链、元宇宙,以及那些待收割的韭菜们!

    前几天看到周星驰在社交账号上招聘web3.0的人才,感觉有必要说说web3.0,当然不是基于技术层面,而是从另一个维度说说web3.0以及其它相关的概念,从而做到如何反欺诈,如何避免被资本割韭菜.想到 ...

  5. LcdToos如何在线对屏进行读写指令调试

    在实际屏调试过程中,工程师经常需要对屏的寄存器频繁进行参数修改和读取测试,LcdTools针对这个做了很好的支持,可以在线进行指令调试,大大提高调试效率. 打开点屏工程,连接PX01并使模组上电点亮. ...

  6. Droplet——一款轻量的Golang应用层框架

    Github地址 如标题所描述的,Droplet 是一个 轻量 的 中间层框架,何为中间层呢? 通常来说,我们的程序(注意这里我们仅仅讨论程序的范围,而非作为一个系统,因此这里不设计如 LB.Gate ...

  7. Druid SQL注入防御模块技术浅析

    官方参考: https://www.bookstack.cn/read/Druid/ffdd9118e6208531.md 前置知识 什么是Druid? Druid是一个高效的数据查询系统,主要解决的 ...

  8. 用 VS Code 搞 Qt6:让信号和槽自动建立连接

    Qt 具备让某个对象的信号与符合要求的槽函数自动建立连接.弄起来也很简单,只要调用这个静态方法即可: QMetaObject::connectSlotsByName(...); connectSlot ...

  9. python-代码编程规范

    命名 常用简写 名称相关 # 信息 information: info # 功能 function : func # 数量 quantity:qty PYQT相关 button : btn_ chec ...

  10. DP?

    杨斌涵//aad69d38 分治优化DP 分治优化1D/1D dp 对于一类 \[f(x) = \min_{k = y}^{x - 1} w(l, r) \] 即所有 \(w(l,r)\) 事先已知, ...