很快乐地发表,咱们公布了.NET 7 预览版3。.NET 7的第三个预览版包含了对可察看性、启动工夫、codegen、GC regions、本地AOT编译等方面的加强。您当初就能够获取并开始尝试新性能,包含:
- 原生 AOT
- 默认 GC regions
- ASP.NET Core 启动工夫改良
您能够下载实用于 Windows、macOS 和 Linux 的 .NET 7 预览版 3。
- 安装程序和二进制文件
- 容器的图片
- Linux包
- 公布阐明
- 已知的问题
- GitHub问题跟踪器
.NET 7预览版3曾经在Visual Studio 17.2预览版3中进行了测试。如果您想尝试 .NET 7和Visual Studio的系列产品,咱们建议您应用预览版。Mac版的Visual Studio临时还未反对.NET 7预览版,但很快就会公布。当初,让咱们理解这个版本中的一些最新更新的内容。
更快、更轻量级的原生AOT利用
在.NET 7 预览版2的博客文章中,咱们发表原生AOT我的项目曾经从试验状态转移到.NET /runtime repo的.NET 7的主线开发中。咱们晓得您们中的许多人都在急迫地期待着来自团队的对于Native AOT的更新,咱们在预览版3中有一些新的更新。
如果您想理解原生AOT的详细信息,或者想要开始应用它,repo文档是最好的抉择。
咱们也意识到您们中的一些人可能不相熟原生 AOT是什么,所以咱们想分享它的一个疾速概述给您们。
▌什么是原生AOT?
提前编译(AOT)是指在应用程序构建时(而不是运行时)生成代码的一系列技术。AOT 对 .NET 来说并不生疏。明天咱们公布了用于客户端和服务器场景的ReadyToRun,以及用于挪动和WASM的Mono AOT。原生AOT为.NET桌面客户端和服务器场景带来了残缺的原生预编译。原生AOT并没有取代这些现有技术,而是提供了一组新的性能,能够解锁新的form factors。
现有的AOT编译的.NET程序集蕴含特定于平台的数据结构和本地代码,用于通常在运行时实现的前置加载工作。预编译这些工件能够节俭启动时的工夫(例如ReadyToRun),并容许拜访非JIT平台(例如iOS)。如果没法做事后编译,.NET要么退回到JIT,要么退回到解释(取决于平台)。
原生AOT相似于.NET现有的AOT技术,但它只生成原生artifacts。事实上,本机AOT运行时并不知道如何读取 .NET程序集文件格式—所有这些都是平台本机的。可执行文件格局解析齐全由底层操作系统解决。
原生AOT的次要长处是在启动工夫、内存应用、拜访受限平台(不容许JIT)和更小的磁盘大小方面。当操作系统将应用程序中的页面放入内存时,应用程序就开始运行。数据结构是为了运行AOT生成的代码而优化的,而不是为了在运行时编译新代码。这相似于Go、Swift和Rust等语言的编译形式。原生AOT最适宜哪些十分看重启动工夫的环境。针对原生AOT的要求比个别的.NET Core/5+应用程序和库更严格。原生AOT禁止在运行时emit新代码(例如Reflection.Emit),也禁止在运行时加载新的 .NET程序集(例如插件模型)。
▌为原生AOT筹备应用程序
对于.NET 7,咱们将控制台利用和原生库作为原生AOT的次要场景。应用程序开发人员和库作者当初能够通过确保他们的应用程序是可调整的来利用原生AOT。因为剪裁是原生AOT编译的必要条件,当初就为剪裁筹备应用程序和库将帮忙它们为原生AOT做好筹备。如果您是任何一个.NET库的作者,遵循“剪裁库”阐明将帮忙你为剪裁库和原生AOT做好筹备。
咱们打算在.NET 7中公布的一个应用原生AOT编译的利用是Crossgen工具。Crossgen是.NET SDK的一部分。CoreCLR AOT编译器生成ReadyToRun可执行文件。Crossgen是用c#编写的,咱们目前将其编译后作为ReadyToRun利用公布。在编译速度和大小方面,咱们曾经看到了一些十分有前途的数字。Crossgen从原生AOT中获益良多,因为它是一个短暂的过程,启动开销主导了整个执行工夫:
展望未来,原生AOT的兼容性将在.NET的下几个版本中失去改善,然而在许多状况下总有理由抉择JIT。咱们还将在dotnet SDK中为应用原生AOT公布我的项目增加更多的反对。
可察看性
.NET 7持续对云原生OpenTelemetry标准的反对。预览版3减少了对标准降级#988和#1708的反对,使采样器的跟踪状态可变。
• 容许跟踪采样器批改流动跟踪状态
// ActivityListener 采样回调 listener.Sample = (ref ActivityCreationOptions<ActivityContext> activityOptions) => { activityOptions = activityOptions with { TraceState = "rojo=00f067aa0ba902b7" }; return ActivitySamplingResult.AllDataAndRecorded; };
System.Composition.Hosting
最新的托管可扩展性框架进行了轻微的更新,以与以前版本的API保持一致。新的API容许向System.Composition.Hosting容器增加单个对象实例。相似于遗留接口System.ComponentModel.Composition.Hosting中提供的性能以及ComposeExportedValue(compostioncontainer, T)(https://aka.ms/exportedvalue)
倡议:将现有对象注入MEF2
namespace System.Composition.Hosting{ public class ContainerConfiguration{ public ContainerConfiguration WithExport<TExport>(TExport exportedInstance); public ContainerConfiguration WithExport<TExport>(TExport exportedInstance, string contractName = null, IDictionary<string, object> metadata = null); public ContainerConfiguration WithExport(Type contractType, object exportedInstance); public ContainerConfiguration WithExport(Type contractType, object exportedInstance, string contractName = null, IDictionary<string, object> metadata = null); }}
启用Write-Xor-Execute后,启动工夫失去了改善
性能依然是.NET 7的次要关注点。dotnet/runtime#65738 PR从新实现了预编码和调用计数存根(分级编译助手存根),以显著缩小运行时中可执行代码创立后批改的数量。这使得启动工夫进步了10-15%。
另外,即便没有启用Write-Xor-Execute,这种变动也会在一些微基准和一些ASPNet基准中带来稳固状态的性能晋升(最高达8%)。
然而,在行将公布的预览版本中,也会有一些由该更改导致的回归(没有启用Write-Xor-Execute)。这是在Orchard和fortune对英特尔处理器的基准测试后果里察看到的。
循环优化
• 对于System.Collections.Tests.Perf_BitArray. BitArrayLeftShift(尺寸:512), 循环克隆将单次调用的持续时间进步了21%。
个别优化
- 从暗藏缓冲区中返回的被调用对象中删除额定的构造体正本
https://github.com/dotnet/run... - 开展String.Equals和str.StartsWith示意常量字符串
https://github.com/dotnet/run... - 扩大Equals/StartsWith 为OrdinalIgnoreCase主动向量化
https://github.com/dotnet/run... - setcc之后的Movzx优化显示代码大小缩小了0.03 ~ 0.16%
https://github.com/dotnet/run...
GC regions默认启用
在预览版 3中,默认状况下启用了region性能,该性能有助于进步高吞吐量应用程序的内存利用率。除了MacOS和原生AOT(未来会启用),该性能当初已在所有平台上启用。更多细节能够拜访这个问题。
因为region最后的调配形式,咱们预计较小的应用程序的工作集会减少。如果您留神到任何性能或性能差别,请在runtime repo中创立一个问题。
密码学:更好的生成X.500名称
通过引入一个类,能够更清晰地解析X.500名称,这一更改简化了解决证书的工作。
让构建x500distishedname更平安、更容易
一般来说,任何想要构建X.500名称的人(比方用CertificateRequest类创立测试证书的人)都是通过字符串操作来实现的,要么是通过简略的文字,要么是通过字符串格式化,例如:
request = new CertificateRequest($"CN={subjectName},OU=Test,O=""Fabrikam, Inc.""", ...);
这通常没有问题,除非subjectName蕴含逗号、引号或任何对解析器有影响的内容。了解决这个问题,咱们增加了x500 distishednamebuilder类。因为每个办法只对一个绝对区别名(RDN)进行操作,所以解析过程中没有歧义。另外,因为RDN标识符失去了扩大,您不再须要猜想“CN”代表什么
(“Common Name”)。
X500DistinguishedNameBuilder nameBuilder = new();nameBuilder.AddCommonName(subjectName);nameBuilder.AddOrganizationalUnitName("Test");nameBuilder.AddOrganizationName("Fabrikam, Inc.");request = new CertificateRequest(nameBuilder.Build(), ...);
针对.NET 7
针对指标.NET 7,你须要在你的我的项目文件中应用.NET 7指标框架代号(TFM)。例如:
<TargetFramework>net7.0</TargetFramework>
请看残缺的.NET 7 tfm汇合,包含特定于操作的tfm。
- net7.0
- net7.0-android
- net7.0-ios
- net7.0-maccatalyst
- net7.0-macos
- net7.0-tvos
- net7.0-windows
咱们心愿从.NET 6降级到.NET 7应该很简略。欢送通知咱们在应用.NET 7测试现有应用程序过程中发现的任何重大变动。
反对
.NET 7是一个以后版本,这意味着它将从公布之日起18个月内取得收费的反对和补丁。值得注意的是,所有版本的品质都是雷同的。惟一的区别是反对的长度。无关.NET反对策略的更多信息,请参阅.NET和.NET Core官网反对策略。
重大的变动
通过浏览.NET 7文档中的重大的变动,你能够找到.NET 7中最新的重大变动的列表。它按区域和版本列出了重大的变更,并提供了具体解释的链接。
要查看有哪些重大的变动曾经被提出来了,然而目前还是review阶段,请follow.NET重大变动的github issue。
路线图
.NET的发行版包含产品、库、运行时和工具,代表了微软外部和内部多个团队的合作。您能够通过浏览产品路线图来理解更多对于这些畛域的信息:
- ASP.NET Core 7和Blazor路线图
https://github.com/dotnet/asp... - EF 7路线图
https://docs.microsoft.com/zh... - ML.NET
https://github.com/dotnet/mac... - .NET MAUI
https://github.com/dotnet/mau... - WinForms
https://github.com/dotnet/win... - WPF
https://github.com/dotnet/wpf... - NuGet
https://github.com/NuGet/Home... - Roslyn
- 运行时
https://github.com/dotnet/cor...
感谢您对.NET的所有反对和奉献。请尝试一下.NET 7预览版3,通知咱们您的想法!
.NET 7预览版3