BenchmarkDotNet多版本性能测试
起因
很多时候我们要用新版本.Net Framework或者.Net Core版本时,会版本每个版本性能.通常来说新版本的性能会更好.这次我们用BenchmarkDotNet来进行多个Runtime性能测试.用数据来说话.先用Mono 6.0和Mono 6.4测试一下.
<!--<TargetFramework>netcoreapp3.0</TargetFramework>-->
<TargetFrameworks>netcoreapp3.0;net472</TargetFrameworks>
现在项目工程文件中,进行以上修改,让项目分别支持.Net Core和.Net Framework. 在来简单看一下测试代码.
[MemoryDiagnoser]
[MonoJob("Mono 6.0", @"E:\softwares\mono-6.0.0.313-x64\Mono\bin\mono.exe")] //指定使用Mono 6.0
[MonoJob("Mono 6.4", @"E:\softwares\mono-6.4.0.198-x64-0\Mono\bin\mono.exe")] //指定使用Mono 6.4
public class MyClass
{
[Benchmark]
public void LocalVar()
{
int a = 256;
int sum = 0;
for (int i = 0; i < int.MaxValue; i++)
{
sum += 129 * a;
sum = 0;
}
}
[Benchmark]
public void ConstVar()
{
const int a = 256;
int sum = 0;
for (int i = 0; i < int.MaxValue; i++)
{
sum += 129 * a;
sum = 0;
}
}
}
--执行如下命令
dotnet run -c Release -f net472
从上面两个方法,常量在Mono 6.4比Mono 6.0做了更多的优化,具体可以通过执行生成的汇编代码来分析. 可以参考 让BenchmarkDotNet输出汇编代码
分别测试.Net Framework/.Net Core及Mono
public class MultipleRuntimes : ManualConfig
{
public MultipleRuntimes()
{
Add(Job.CoreRT.With(CsProjCoreToolchain.NetCoreApp30)); // .NET Core 3.0
Add(Job.Clr.With(CsProjClassicNetToolchain.Net472)); // NET 4.7.2
Add(Job.DryMono.With(CsProjClassicNetToolchain.Net472));
Add(HtmlExporter.Default);
}
}
[Config(typeof(MultipleRuntimes))]
//[MemoryDiagnoser]
//[MonoJob("Mono 6.0", @"E:\softwares\mono-6.0.0.313-x64\Mono\bin\mono.exe")] //指定使用Mono 6.0
//[MonoJob("Mono 6.4", @"E:\softwares\mono-6.4.0.198-x64-0\Mono\bin\mono.exe")] //指定使用Mono 6.4
public class MyClass
{
[Benchmark]
public void LocalVar()
{
int a = 256;
int sum = 0;
for (int i = 0; i < int.MaxValue; i++)
{
sum += 129 * a;
sum = 0;
}
}
[Benchmark]
public void ConstVar()
{
const int a = 256;
int sum = 0;
for (int i = 0; i < int.MaxValue; i++)
{
sum += 129 * a;
sum = 0;
}
}
}
多版本测试还是有些问题,再找找文档.
秋风
2019-10-20