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.0和 Mono 6.4 性能测试对比

从上面两个方法,常量在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;
        }
    }
}

.Net Framework 和 Dotnet Core 3.0及Mono

多版本测试还是有些问题,再找找文档.


秋风 2019-10-20