.NET 7的性能改进有哪些具体细节?

摘要:原文 | Stephen Toub 翻译 | 郑子铭 一年前,我发布了.NET 6 中的性能改进,紧接着是.NET 5、.NET Core 3.0、.NET Core 2.1和.NET Core 2.0的类似帖子。我喜欢写这些帖子,也喜欢阅
原文 | Stephen Toub 翻译 | 郑子铭 一年前,我发布了.NET 6 中的性能改进,紧接着是.NET 5、.NET Core 3.0、.NET Core 2.1和.NET Core 2.0的类似帖子。我喜欢写这些帖子,也喜欢阅读开发人员对它们的回复。去年的一条评论特别引起了我的共鸣。评论者引用了虎胆龙威的电影名言,“'当亚历山大看到他的领域的广度时,他为没有更多的世界可以征服而哭泣'”,并质疑 .NET 的性能改进是否相似。水井干涸了吗?是否没有更多的“[性能]世界可以征服”?我有点头晕地说,即使 .NET 6 有多快,.NET 7 明确地强调了可以做的和已经做的更多。 与以前版本的 .NET 一样,性能是遍及整个堆栈的关键焦点,无论是明确为性能创建的功能,还是在设计和实现时仍牢记性能的非性能相关功能。现在 .NET 7 候选版本即将发布,现在是讨论其中大部分内容的好时机。在过去的一年中,每次我审查可能对性能产生积极影响的 PR 时,我都会将该链接复制到我维护的期刊中,以便撰写这篇文章。几周前,当我坐下来写这篇文章时,我看到了一份包含近 1000 个影响性能的 PR 的列表(在发布的 7000 多个 PR 中),我很高兴与您分享其中的近500个。 在我们深入探讨之前先想一想。在过去的几年里,我收到了一些奇怪的负面反馈,关于我一些以性能为中心的文章的长度,虽然我不同意这些批评,但我尊重他们的意见。因此,今年,将此视为“选择你自己的探险”。如果您来这里只是为了寻找一个超短的探险,一个提供顶级摘要和核心信息的探险,以节省您在这里的时间,我很乐意为您效劳: TL;DR:.NET 7 很快。真的很快。上千个影响性能的 PR 进入了这个版本的运行时和核心库,更不用说 ASP.NET Core 和 Windows Forms 以及 Entity Framework 和其他方面的所有改进。它是有史以来最快的 .NET。如果你的经理问你为什么你的项目应该升级到 .NET 7,你可以说“除了版本中的所有新功能之外,.NET 7 超级快。” 或者,如果您更喜欢稍微长一点的探险,其中充满了有趣的以性能为中心的数据块,请考虑浏览一下帖子,寻找小代码片段和相应的表格,这些表格显示了大量可衡量的性能改进。到那时,你也可能会昂首阔步地走开并表达我的谢意。 两条提到的路径都实现了我花时间写这些帖子的主要目标之一,以突出下一个版本的伟大之处并鼓励大家尝试一下。但是,我对这些帖子也有其他目标。我希望每个感兴趣的人在看完这篇文章后,都能对.NET是如何实现的,为什么会做出各种决定,评估了各种权衡,采用了哪些技术,考虑了哪些算法,以及利用了哪些有价值的工具和方法来使.NET比以前更快。我希望开发人员从我们自己的学习中学习,并找到将这些新发现的知识应用到他们自己的代码库中的方法,从而进一步提高生态系统中代码的整体性能。我希望开发人员多做一些工作,考虑在他们下次处理棘手问题时寻求探查器,考虑查看他们正在使用的组件的源代码以更好地理解如何使用它,并考虑重新审视以前的假设和决策以确定它们是否仍然准确和适当。我希望开发人员对提交 PR 以改进 .NET 的前景感到兴奋,不仅是为了他们自己,也是为了全球使用 .NET 的每个开发人员。如果其中任何一个听起来很有趣,那么我鼓励您选择最后一个探险:准备一瓶您最喜欢的热饮,放松一下,尽情享受吧。 哦,请不要把这个打印到纸上。"打印成PDF "告诉我这将需要三分之一的卷轴。如果你想要一个格式很好的PDF,这里有一个可以下载。 目录 Setup JIT GC Native AOT Mono Reflection Interop Threading Primitive Types and Numerics Arrays, Strings, and Spans Regex Collections LINQ File I/O Compression Networking JSON XML Cryptography Diagnostics Exceptions Registry Analyzers What’s Next? Setup 这篇文章中的微基准测试使用 benchmarkdotnet。为了让您更轻松地进行自己的验证,我为我使用的基准设置了一个非常简单的设置。创建一个新的 C# 项目: dotnet new console -o benchmarks cd benchmarks 您的新基准目录将包含一个 benchmarks.csproj 文件和一个 Program.cs 文件。
阅读全文