【翻译】.NET 5中的性能改进

【翻译】.NET 5中的性能改进

在.NET Core之前的版本中,其实已经在博客中介绍了在该版本中发现的重大性能改进。 从.NET Core 2.0到.NET Core 2.1到.NET Core 3.0的每一篇文章,发现
谈论越来越多的东西。 然而有趣的是,每次都想知道下一次是否有足够的意义的改进以保证再发表一篇文章。 .NET 5已经实现了许多性能改进,尽管直到今年秋天才计划发布最终版本,并且到那时很有可能会有更多的改进,但是还要强调一下,现在已提供的改进。 在这篇文章中,重点介绍约250个PR,这些请求为整个.NET 5的性能提升做出了巨大贡献。

安装


Benchmark.NET现在是衡量.NET代码性能的规范工具,可轻松分析代码段的吞吐量和分配。 因此,本文中大部分示例都是使用使用该工具编写的微基准来衡量的。首先创建了一个目录,然后使用dotnet工具对其进行了扩展:

mkdir Benchmarks cd Benchmarks dotnet new console


生成的Benchmarks.csproj的内容扩展为如下所示:

<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <AllowUnsafeBlocks>true</AllowUnsafeBlocks> <ServerGarbageCollection>true</ServerGarbageCollection> <TargetFrameworks>net5.0;netcoreapp3.1;net48</TargetFrameworks> </PropertyGroup> <ItemGroup> <PackageReference Include="benchmarkdotnet" Version="0.12.1" /> </ItemGroup> <ItemGroup Condition=" '$(TargetFramework)' == 'net48' "> <PackageReference Include="System.Memory" Version="4.5.4" /> <PackageReference Include="System.Text.Json" Version="4.7.2" /> <Reference Include="System.Net.Http" /> </ItemGroup> </Project>


这样,就可以针对.NET Framework 4.8,.NET Core 3.1和.NET 5执行基准测试(目前已为Preview 8安装了每晚生成的版本)。.csproj还引用Benchmark.NET NuGet软件包(其最新版本为12.1版),以便能够使用其功能,然后引用其他几个库和软件包,特别是为了支持能够在其上运行测试 .NET Framework 4.8。
然后,将生成的Program.cs文件更新到同一文件夹中,如下所示:

using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Diagnosers; using BenchmarkDotNet.Running; using System; using System.Buffers.Text; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Immutable; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Security; using System.Net.Sockets; using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; using System.Text; using System.Text.Json; using System.Text.RegularExpressions; [MemoryDiagnoser] public class Program { static void Main(string[] args) => BenchmarkSwitcher.FromAssemblies(new[] { typeof(Program).Assembly }).Run(args); // BENCHMARKS GO HERE }


对于每次测试,每个示例中显示的基准代码复制/粘贴将显示"// BENCHMARKS GO HERE"的位置。
为了运行基准测试,然后做:

dotnet run -c Release -f net48 --runtimes net48 netcoreapp31 netcoreapp50 --filter ** --join


这告诉Benchmark.NET:

使用.NET Framework 4.8 来建立基准。

针对.NET Framework 4.8,.NET Core 3.1和.NET 5分别运行基准测试。

在程序集中包含所有基准测试(不要过滤掉任何基准测试)。

将所有基准测试的输出结果合并在一起,并在运行结束时显示(而不是贯穿整个过程)。


在某些情况下,针对特定目标的API并不存在,我只是省略了命令行的这一部分。


最后,请注意以下几点:

从运行时和核心库的角度来看,它与几个月前发布的前身相比没有多少改进。 但是,还进行了一些改进,在某些情况下,目前已经将.NET 5的改进移植回了.NET Core 3.1,在这些改进中,这些更改被认为具有足够的影响力,可以保证可以添加到长期支持中(LTS)版本。 因此,我在这里所做的所有比较都是针对最新的.NET Core 3.1服务版本(3.1.5),而不是针对.NET Core 3.0。

由于比较是关于.NET 5与.NET Core 3.1的,而且.NET Core 3.1不包括mono运行时,因此不讨论对mono所做的改进,也没有专门针对“Blazor”。 因此,当指的是“runtime”时,指的是coreclr,即使从.NET 5开始,它也包含多个运行时,并且所有这些都已得到改进。

大多数示例都在Windows上运行,因为也希望能够与.NET Framework 4.8进行比较。 但是,除非另有说明,否则所有显示的示例均适用于Windows,Linux和macOS。

需要注意的是: 这里的所有测量数据都是在的台式机上进行的,测量结果可能会有所不同。微基准测试对许多因素都非常敏感,包括处理器数量、处理器架构、内存和缓存速度等等。但是,一般来说,我关注的是性能改进,并包含了通常能够承受此类差异的示例。


让我们开始吧…


GC

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsssyf.html