关于.net:官宣-NET-7-预览版3

95次阅读

共计 5279 个字符,预计需要花费 14 分钟才能阅读完成。

很快乐地发表,咱们公布了.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

正文完
 0