您的位置:网站首页 > net源码 > 正文

6 攻略大全(一)

类别:net源码 日期:2022-4-28 14:36:46 人气: 来源:

  欢迎使用 .NET 6。今天的版本是.NET 团队和社区一年多努力的结果。C# 10 和 F# 6 提供了语言改进,使您的代码更简单、更好、性能大幅提升,我们已经看到微软降低了托管云服务的成本。.NET 6 是第一个原生支持 Apple Silicon (Arm64) 的版本,并且还针对 Windows Arm64 进行了改进。我们构建了一个新的动态配置文件引导优化 (PGO) 系统,该系统可提供仅在运行时才可能进行的深度优化。使用dotnet monitor 和 OpenTelemetry 改进了云诊断。WebAssembly 支持更有能力和性能。为HTTP/3添加了新的 API ,处理 JSON、数学和直接操作内存。.NET 6 将支持三年。开发人员已经开始将应用程序升级到 .NET 6,我们在生产中听到了很好的早期。.NET 6 已为您的应用程序做好准备。

  该版本包括大约一万次 git 提交。即使这篇文章很长,它也跳过了许多改进。您必须下载并试用.NET 6 才能看到所有新功能。

  注意:如果您的应用已经在应用服务上运行 .NET 6 预览版或 RC 版本,则在将 .NET 6 运行时和 SDK 部署到您所在区域后,它将在第一次重新启动时自动更新。如果您部署了一个的应用程序,您将需要重新构建和重新部署。

  .NET 6 为浏览器、云、桌面、物联网和移动应用程序提供了一个统一的平台。底层平台已更新,可满足所有应用类型的需求,并便于在所有应用中重用代码。新功能和改进同时适用于所有应用程序,因此您在云或移动设备上运行的代码的行为方式相同并具有相同的优势。

  .NET 开发人员的范围随着每个版本的发布而不断扩大。机器学习和 WebAssembly 是最近添加的两个。例如,通过机器学习,您可以编写在流数据中查找异常的应用程序。使用 WebAssembly,您可以在浏览器中托管 .NET 应用程序,就像 HTML 和 Java 一样,或者将它们与 HTML 和 Java 混合使用。

  最令人兴奋的新增功能之一是.NET Multi-platform App UI (.NET MAUI)。您现在可以在单个项目中编写代码,从而跨桌面和移动操作系统提供现代客户端应用程序体验。.NET MAUI 将比 .NET 6 稍晚发布。我们在 .NET MAUI 上投入了大量时间和精力,很高兴能够发布它并看到 .NET MAUI 应用程序投入生产。

  当然,.NET 应用程序也可以在家中使用 Windows 桌面(使用 Windows Forms 和WPF)以及使用 ASP.NET Core 在云中。它们是我们提供时间最长的应用程序类型,并且仍然非常受欢迎,我们在 .NET 6 中对其进行了改进。

  如果您针对特定操作系统(例如编写Windows 窗体或 iOS 应用程序),那么还有另一组 TFM(每个都针对不言而喻的操作系统)供您使用。它们使您可以访问所有 net6.0的API以及一堆特定于操作系统的 API。

  每个无版本 TFM 都相当于针对 .NET 6 支持的最低操作系统版本。如果您想要具体或访问更新的 API,可以指定操作系统版本。

  操作系统特定的 TFM 之间没有兼容性关系。例如,net6.0-ios 与 net6.0-tvos 不兼容。如果您想共享代码,您需要使用带有 #if 语句的源代码或带有 net6.0 目标代码的二进制文件来实现。

  自从我们启动 .NET Core 项目以来,该团队一直在不断地关注性能。Stephen Toub 在记录每个版本的 .NET 性能进展方面做得非常出色。欢迎查看在 .NET 6 中的性能改进的帖子。在这篇文章中,里面包括您想了解的重大性能改进,包括文件 IO、接口转换、PGO 和 System.Text.Json。

  动态 PGO 建立在分层编译的基础上,它使方法能够首先非常快速地编译(称为“第 0 层”)以提高启动性能,然后在启用大量优化的情况下随后重新编译(称为“第 1 层”)一旦该方法被证明是有影响的。该模型使方法能够在第 0 层中进行检测,以允许对代码的执行进行各种观察。在第 1 层重新调整这些方法时,从第 0 层执行收集的信息用于更好地优化第 1 层代码。这就是机制的本质。

  动态 PGO 的启动时间将比默认运行时稍慢,因为在第 0 层方法中运行了额外的代码来观察方法行为。

  要启用动态 PGO,请在应用程序将运行的中设置 DOTNET_TieredPGO=1。您还必须确保启用分层编译(默认情况下)。动态 PGO 是可选的,因为它是一种新的且有影响力的技术。我们希望发布选择加入使用和相关反馈,以确保它经过全面压力测试。我们对分层编译做了同样的事情。至少一个非常大的 Microsoft 服务支持并已在生产中使用动态 PGO。我们鼓励您尝试一下。

  您可以在.NET 6中的性能帖子中看到更多关于动态 PGO 优势的信息,包括以下微基准,它测量特定 LINQ 枚举器的成本。

  这是一个相当大的差异,但代码大小也有所增加,这可能会让一些读者感到惊讶。这是由 JIT 生成的汇编代码的大小,而不是内存分配(这是一个更常见的焦点)。.NET 6 性能帖子对此有很好的解释。

  PGO 实现中常见的一种优化是“热/冷分离”,其中经常执行的方法部分(“热”)在方法开始时靠近在一起,而不经常执行的方法部分(“冷”)是移到方法的末尾。这样可以更好地使用指令缓存,并最大限度地减少可能未使用的代码负载。

  作为上下文,接口调度是 .NET 中最昂贵的调用类型。非虚拟方法调用是最快的,甚至更快的是可以通过内联消除的调用。在这种情况下,动态 PGO 为 MoveNext 提供了两个(替代)调用站点。第一个 - 热的 - 是对 Enumerable+RangeIterator.MoveNext 的直接调用,另一个 - 冷的 - 是通过 IEnumeratorint 的虚拟接口调用。如果大多数时候最热门的人都被叫到,那将是一个巨大的胜利。

  这就是魔法。当 JIT 检测此方法的第 0 层代码时,包括检测此接口调度以每次调用时 _source 的具体类型。JIT 发现每次调用都在一个名为 Enumerable+RangeIterator 的类型上,这是一个私有类,用于在 Enumerable 实现内部实现 Enumerable.Range。因此,对于第 1 层,JIT 已发出检查以查看 _source 的类型是否为 Enumerable+RangeIterator:如果不是,则跳转到我们之前强调的执行正常接口调度的冷部分。但如果是 - 基于分析数据,预计绝大多数时间都是这种情况 - 然后它可以继续直接调用非虚拟化的 Enumerable+RangeIterator.MoveNext 方法。不仅如此,它还认为内联 MoveNext 方法是有利可图的。最终效果是生成的汇编代码有点大,但针对预期最常见的确切场景进行了优化。当我们开始构建动态 PGO 时,这些就是我们想要的那种胜利。

  FileStream 几乎完全用 .NET 6 重写,重点是提高异步文件 IO 性能。在 Windows 上,实现不再使用阻塞 API,并且可以快几倍!我们还改进了所有平台上的内存使用。在第一次异步操作(通常分配)之后,我们已经使异步操作免分配!此外,我们已经使 Windows 和 Unix 实现不同的边缘情况的行为统一(这是可能的)。

  这种重写的性能改进使所有操作系统受益。对 Windows 的好处是最大的,因为它远远落后。macOS 和 Linux 用户也应该会看到显着 FileStream 的性能改进。

  在带有 SSD 驱动器的 Windows 上,我们观察到4倍的加速和超过1200倍的分配下降:

  预分配大小功能提高了性能,因为写入操作不需要扩展文件,并且文件不太可能被碎片化。这种方法提高了可靠性,因为写入操作将不再因空间不足而失败,因为空间已被保留。Scatter/Gather IO API 减少了写入数据所需的系统调用次数。

  将 .NET 运行时的一部分从 C++ 迁移到托管 C# 的最大优势之一是它降低了贡献的障碍。这包括接口转换,它作为早期的 .NET 6 更改移至 C#。.NET 生态系统中懂 C# 的人比懂 C++ 的人多(而且运行时使用具有挑战性的 C++ 模式)。仅仅能够阅读构成运行时的一些代码是培养以各种形式做出贡献的信心的重要一步。

  我们为 System.Text.Json 添加了一个源代码生成器,它避免了在运行时进行反射和代码生成的需要,并且可以在构建时生成最佳序列化代码。序列化程序通常使用非常保守的技术编写,因为它们必须如此。但是,如果您阅读自己的序列化源代码(使用序列化程序),您可以看到明显的选择应该是什么,可以使序列化程序在您的特定情况下更加优化。这正是这个新的源生成器所做的。

  除了提高性能和减少内存之外,源代码生成器还生成最适合装配修整的代码。这有助于制作更小的应用程序。

  序列化POCO是一种非常常见的场景。使用新的源代码生成器,我们观察到序列化速度比我们的基准快 1.6 倍。

  TechEmpower 缓存基准测试平台或框架对来自数据库的信息进行内存缓存。基准测试的 .NET 实现执行缓存数据的 JSON 序列化,以便将其作为响应发送到测试工具。

  欢迎来到 C# 10。C# 10的一个主要主题是继续从C# 9中的语句开始的简化之旅。新功能从 Program.cs 中删除了更多的仪式,导致程序只有一行。他们的灵感来自于与没有 C# 经验的人(学生、专业开发人员和其他人)交谈,并了解什么对他们来说最有效且最直观。

  大多数.NET SDK 模板都已更新,以提供现在可以使用 C# 10 实现的更简单、更简洁的体验。我们收到反馈说,有些人不喜欢新模板,因为它们不适合专家,删除面向对象,删除在编写 C# 的第一天学习的重要概念,或鼓励在一个文件中编写整个程序。客观地说,这些观点都不正确。新模型同样适用于作为专业开发人员的学生。但是,它与 .NET 6 之前的 C 派生模型不同。

  隐式 usings 是一个 MSBuild 概念,它会根据 SDK自动添加一组指令。例如,控制台应用程序隐式使用不同于 ASP.NET Core。

  文件范围的命名空间使您能够声明整个文件的命名空间,而无需将剩余内容嵌套在{ ... }中. 只允许一个,并且必须在声明任何类型之前出现。

  C# 9 将记录作为一种特殊的面向值的类形式引入。在 C# 10 中,您还可以声明结构记录。C# 中的结构已经具有值相等,但记录结构添加了 == 运算符和 IEquatableT 的实现,以及基于值的 ToString 实现:

  就像记录类一样,记录结构可以是“的”,这意味着它们有一个主构造函数,它隐式声明与参数对应的公共:

  但是,与记录类不同,隐式公共是可变的自动实现的属性。这样一来,记录结构就成为了元组的自然成长故事。例如,如果您有一个返回类型(string FirstName, string LastName),并且您希望将其扩展为命名类型,您可以轻松地声明相应的结构记录并可变语义。

  属猪的最佳配偶

  如果你想要一个具有只读属性的不可变记录,你可以声明整个记录结构 readonly(就像你可以其他结构一样):

  F# 6旨在让 F# 更简单、更高效。这适用于语言设计、库和工具。我们对 F# 6(及更高版本)的目标是消除语言中让用户感到惊讶或阻碍学习 F# 的极端情况。我们很高兴能与 F# 社区合作进行这项持续的努力。

  新语法task {…}直接创建一个任务并启动它。这是 F# 6 中最重要的功能之一,它使异步任务更简单、性能更高,并且与 C# 和其他 .NET 语言的互操作性更强。以前,创建 .NET 任务需要使用async {…}来创建任务并调用 Async.StartImmediateAsTask。

  该功能 task {…}建立在称为“可恢复代码”RFC FS-1087的基础之上。可恢复代码是一个核心特性,我们希望在未来使用它来构建其他高性能异步和状态机。

  F# 6 还为库作者添加了其他性能特性,包括 InlineIfLambda 和F# 活动模式的未装箱表示。一个特别显着的性能改进在于列表和数组表达式的编译,现在它们的速度提高了4 倍,并且调试也更好、更简单。

  F# 6 启用expr[idx]索引语法。到目前为止,F# 一直使用 expr.[idx] 进行索引。删除点符号是基于第一次使用 F# 用户的反复反馈,点的使用与他们期望的标准实践有不必要的差异。在新代码中,我们系统地使用新的 expr[idx]索引语法。作为一个社区,我们都应该切换到这种语法。

  F# 社区为使 F# 语言在 F# 6 中更加统一做出了重要改进。其中最重要的是消除了 F# 缩进规则中的一些不一致和。使 F# 更加统一的其他设计添加包括添加as图案;在计算表达式中允许“重载自定义操作”(对 DSL 有用);允许_丢弃use绑定并允许%B在输出中进行二进制格式化。F# 核心库添加了用于复制和更新列表、数组和序列的新函数,以及其他NativePtr内在函数。自 2.0 起弃用的 F# 的一些旧功能现在会导致错误。其中许多更改更好地使 F# 与您的期望保持一致,从而减少意外。

  F# 6 还增加了对 F# 中其他“隐式”和“类型导向”转换的支持。这意味着更少的显式向上转换,并为 .NET 样式的隐式转换添加了一流的支持。F# 也进行了调整,以更好地适应使用 64 位整数的数字库时代,并隐式扩展了 32 位整数。

  F# 6 中的工具改进使日常编码更容易。新的“管道调试”允许您单步执行、设置断点并检查 F# 管道语法input f1 f2 的中间值。阴影值的调试显示已得到改进,消除了调试时常见的混淆源。F# 工具现在也更高效,F# 编译器并行执行解析阶段。F# IDE 工具也得到了改进。F# 脚本现在更加健壮,允许您通过global.json文件固定使用的 .NET SDK 版本。

  Hot Reload 是另一个性能特性,专注于开发人员的生产力。它使您能够对正在运行的应用程序进行各种代码编辑,从而缩短您等待应用程序重新构建、重新启动或重新到您在进行代码更改后所在所需的时间。

  使用 CLI 时,只需使用 启动您的 .NET 6 应用程序dotnet watch,进行任何受支持的编辑,然后在保存文件时(如在 Visual Studio Code 中),这些更改将立即应用。如果不支持更改,详细信息将记录到命令窗口。

  此图像显示了一个使用 dotnet watch. 我对.cs文件和.cshtml 文件进行了编辑(如日志中所述),两者都应用于代码并在不到半秒的时间内非常快速地反映在浏览器中。

  使用 Visual Studio 2022 时,只需启动您的应用程序,进行支持的更改,然后使用新的“热重载”按钮(如下图所示)应用这些更改。您还可以通过同一按钮上的下拉菜单选择在保存时应用更改。使用 Visual Studio 2022 时,热重载可用于多个 .NET 版本,适用于 .NET 5+、.NET Core 和 .NET Framework。例如,您将能够对按钮的OnClickEvent 处理程序进行代码隐藏更改。应用程序的 Main 方法不支持它。

  .NET 6 中的安全性得到了显着改进。它始终是团队关注的重点,包括建模、加密和深度防御防御。

  在 Linux 上,我们依赖 OpenSSL 进行所有加密操作,包括 TLS(HTTPS 必需)。在 macOS 和 Windows 上,我们依赖操作系统提供的功能来实现相同的目的。对于每个新版本的 .NET,我们经常需要添加对新版本 OpenSSL 的支持。.NET 6 增加了对OpenSSL 3的支持。

  .NET 6 需要 OpenSSL 1.1 或更高版本,并且会更喜欢它可以找到的最高安装版本的 OpenSSL,直到并包括 v3。在一般情况下,当您使用的 Linux 发行版默认切换到 OpenSSL 3 时,您最有可能开始使用 OpenSSL 3。大多数发行版还没有这样做。例如,如果您在 Red Hat 8 或 Ubuntu 20.04 上安装 .NET 6,您将不会(在撰写本文时)开始使用 OpenSSL 3。

  我们还发布了新的运行时安全缓解线图。重要的是,您使用的运行时不受教科书类型的影响。我们正在满足这一需求。在 .NET 6 中,我们构建了W^X和英特尔控制流强制技术 (CET)的初始实现。W^X 完全受支持,默认为 macOS Arm64 启用,并且可以选择加入其他。CET 是所有的选择加入和预览。我们希望在 .NET 7 中的所有中默认启用这两种技术。

  

关键词:net源码编译
0
0
0
0
0
0
0
0
下一篇:没有资料

网友评论 ()条 查看

姓名: 验证码: 看不清楚,换一个

推荐文章更多

热门图文更多

最新文章更多

关于联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助

CopyRight 2002-2012 技术支持 源码吧 FXT All Rights Reserved

赞助合作: