对比不同运行时
微软整天说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.0
和 net7.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.Net70
和 RuntimeMoniker.Net60
分别代表 net7.0
和 net6.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
进行了优化