BenchmarkDotNet-对比不同运行时

发布时间 2023-10-09 17:35:50作者: 崩坏的领航员

微软整天说dotnet的新版本比旧版本快了很多, 每次更新都说有性能提升, 有各种各样的调用优化, 为了验证微软是不是瞎说, 我们可以对比不同的运行时

首先需要修改项目文件, 将原来的单运行时换成多运行时

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFrameworks>net6.0;net7.0;</TargetFrameworks>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="BenchmarkDotNet" Version="0.13.9"/>
  </ItemGroup>
</Project>

这边选择对比 net6.0net7.0

然后修改Test类, 添加特性[SimpleJob]

[SimpleJob(RuntimeMoniker.Net70)]
[SimpleJob(RuntimeMoniker.Net60, baseline: true)]
public class Test
{
    public int Count = 100;
    [Benchmark(Baseline = true)]
    public void TestEmpty()
    {
        for (var i = 0; i < Count; i++)
            string.IsNullOrEmpty("");
    }
    [Benchmark]
    public void TestWhiteSpace()
    {
        for (var i = 0; i < Count; i++)
            string.IsNullOrWhiteSpace("");
    }
}

RuntimeMoniker.Net70RuntimeMoniker.Net60 分别代表 net7.0net6.0

baseline: true 表示将 net6.0 作为基准

此时的测试基准是 net6.0 中的 TestEmpty 方法

然后需要运行命令, 不过由于支持了多运行时, 所以启动时的命令也要稍作修改, 指定一个运行时

dotnet run -c Release --framework net6.0

至于具体指定哪一个, 对结果不会有太大影响

测试完成结果如下

Method Job Runtime Mean Error StdDev Ratio RatioSD
TestEmpty .NET 6.0 .NET 6.0 29.64 ns 0.356 ns 0.333 ns 1.00 0.00
TestWhiteSpace .NET 6.0 .NET 6.0 212.49 ns 3.012 ns 2.817 ns 7.17 0.13
TestEmpty .NET 7.0 .NET 7.0 29.60 ns 0.163 ns 0.136 ns 1.00 0.01
TestWhiteSpace .NET 7.0 .NET 7.0 29.47 ns 0.345 ns 0.306 ns 0.99 0.01

可以看到在net7.0中已经对string.IsNullOrWhiteSpace进行了优化