使用BenchmarkDotNet测试.Net 6代码

起因

在安装.Net 6 预览版1之后,没有使用Benchmark.DotNet进行过代码测试,便想起看看在.Net 6中是否有性能改进.

准备工作

测试代码,便用了编码中代码优化 第2节和第3节代码,主要是方便,现成的代码
dotnet run -c Release -f net5.0 --runtimes netcoreapp50 netcoreapp60  --filter ** --join

看到结果: BenchmarkDotNet 在v0.12.1版本并不支持.Net 6运行时

BenchmarkDotNet 在v0.12.1版本并不支持.Net 6运行时

于是便在github上看BenchmarkDotNet源码最近有没有修改代码.还好看到最新是有更新代码的.

github地址:BenchmarkDotNet

BenchmarkDotNet在github上有修改源码 

想起电脑上有benchmark.dotnet源码,便更新一下代码,本地编译一下,在项目中重新引用一下.重新运行测试程序.

在Benchmark.DotNet在.Net 5中参数有一定调整,更清晰,若netcoreapp 50改为.net50

在Benchmark.DotNet在.Net 5中参数有一定调整,更清晰,若netcoreapp 50改为net50,所以netcoreapp60应该改为net60

#netcoreapp50 →net50 以.Net5.0为基线版本
dotnet run -c Release -f net5.0 --runtimes net50 net60  --filter ** --join

.Net 5和.Net 6预览版1对比

在Benchmark.DotNet在.Net 5和.Net 6 预览版第一版,性能对比
同样的代码,在对比结果,除了StackTest这一个,发现在.Net 6还是有改进的.

.Net 5和.Net 6预览版2对比

在Benchmark.DotNet在.Net 5和.Net 6 预览版第二版,性能对比
同样的代码,发现在.Net 6中StackTest比.Net 5性能提升31%,HeapTest也提升24%,只有池化(这里是ArrayPool)这一块是开倒车了,和.Net 5相差36%的.

对比.Net 6预览版1和.Net 6预览版2汇编代码:
对.Net 6 预览1和预览2生成的汇编代码对比
查看System.Private.CoreLib/src/System/Buffers/TlsOverPerCoreLockedStacksArrayPool.cs改动并不是很大,只是增加事件追踪(ArrayPoolEventSource)了.所以推测还是因为在JIT这一块的改进.

当然毕竟是预览版,当前的.Net源码是一直出于改进,在.Net 6也一直在改进JIT.
我们看一下在订阅.Net项目的邮件中,关于JIT的邮件有一千五百多封.
在订阅.Net项目邮件,查找JIT相关的邮件数量

Benchmark.DotNet源码发现问题

接下来BenchmarkDotNet要对.Net 6.0进行支持.现在是刚刚加入支持.
在BenchmarkDotNet/Environments/Runtimes/CoreRtRuntime.cs发现这个问题,看下图
BenchmarkDotNet对CoreRT是有点问题的
秋风 2021-03-19