让BenchmarkDotNet输出汇编代码

介绍

在使用BenchmarkDotNet做性能测试的时候,是可以输出c#最后在机器上执行的汇编代码的.如果不会使用BenchmarkDotNet,可以先去看看 BenchmarkDotNet你值得拥有 先看看从c#编译到程序执行的全过程.

根据图了解一下过程

csharp从编译到执行的全过程


代码

[MemoryDiagnoser]
[DisassemblyDiagnoser(printAsm: true, printSource: true)]  //printAsm 输出汇编代码 printSource 输出源码
public class TestString
{
    //构建一组参数
    [Params(1024)]
    public int Count { get; set; }

    //Benchmark特性标签,代表要测试的方法
    [Benchmark]
    public void TestStringAppend()
    {
        string str = "";
        for (int i = 0; i < Count; i++)
        {
            str = str + i;
        }
    }

    [Benchmark]
    public void TestStringBuilder()
    {
        StringBuilder stringBuilder = new StringBuilder(Count);
        for (int i = 0; i < Count; i++)
        {
            stringBuilder.Append(i);
        }
    }
}

执行命令:

dotnet run -c release

遇到如下的错误:

使用BenchmarkDotNet遇到的错误

根据错误提示,在项目工程文件中加入图中提示两个属性:

<PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <DebugType>pdbonly</DebugType>
    <DebugSymbols>true</DebugSymbols>
 </PropertyGroup>

重新执行运行命令.在生成的结果中(测试代码生成汇编代码太长,用其他代码生成的结果代替)

BenchmarkDotNet 测试代码生成汇编进行对比

分析生成的汇编代码,才能更好的优化代码.

秋风 2019-10-13