使用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运行时
于是便在github上看BenchmarkDotNet源码最近有没有修改代码.还好看到最新是有更新代码的.
github地址:BenchmarkDotNet
想起电脑上有benchmark.dotnet源码,便更新一下代码,本地编译一下,在项目中重新引用一下.重新运行测试程序.
在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对比
同样的代码,在对比结果,除了StackTest这一个,发现在.Net 6还是有改进的.
.Net 5和.Net 6预览版2对比
同样的代码,发现在.Net 6中StackTest比.Net 5性能提升31%,HeapTest也提升24%,只有池化(这里是ArrayPool)这一块是开倒车了,和.Net 5相差36%的.
对比.Net 6预览版1和.Net 6预览版2汇编代码:
查看System.Private.CoreLib/src/System/Buffers/TlsOverPerCoreLockedStacksArrayPool.cs改动并不是很大,只是增加事件追踪(ArrayPoolEventSource)了.所以推测还是因为在JIT这一块的改进.
当然毕竟是预览版,当前的.Net源码是一直出于改进,在.Net 6也一直在改进JIT.
我们看一下在订阅.Net项目的邮件中,关于JIT的邮件有一千五百多封.

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