BenchmarkDotNet你值得拥有

起因

不过是在工作中,还是个人在代码书写的过程,在拿不准有个方式更好的时候,通常我们会做一些性能测试.在通过对比性能和那种更让人理解之后做出取舍.以往在做性能对别,我一般用Stopwatch来做,自从发现BenchmarkDotNet后,感觉这个组件非常好用.在微软发布.Net Core时的一些性能测试,也是用BenchmarkDotNet.先看看如何使用吧!



1. 安装BenchmarkDotNet

在NuGet管理器中,搜索BenchmarkDotNet,在进行安装
在NuGet包管理器中,搜索BenchmarkDotNet,进行安装

2. 构建测试类(使用Benchmark和Params这两个特性标签)

public class TestString
{
    //构建一组参数
    [Params(1024, 2048, 4096)]
    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);
        }
    }
}


private static void Main(string[] args)
{
    //进行TestString性能测试
    BenchmarkRunner.Run<TestString>();
}

使用BenchmarkDotNet测试性能注意事项:

  1. 项目要使用Release模式,Debug模式是不可以的.
  2. 类/方法/属性都要public.
  3. 最好是在命令行运行测试程序.
命令:

dotnet run -c release

测试结果:

TestString使用BenchmarkDotNet测试结果

通过上图,TestStringAppend和TestStingBuilder分别执行了3次.为什么执行了3次,是因为在Count属性加Params特性,参数分别为1024,2028,4096.
根据测试结果,很直观的发现string和StrinBuilder在字符串拼接的时候,数量越大,差距越大.

3. 通常测试性能,不只是看耗时,还要看GC,该怎么做呢?

在BenchmarkDotNet测试结果显示GC和内存分配,其实是很简单的.只需在类上方加MemoryDiagnoser特性
//要显示GC和内存分配,加MemoryDiagnoser
[MemoryDiagnoser]
public class TestString
{
    //构建一组参数
    [Params(1024, 2048, 4096)]
    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);
        }
    }
}

让BenchmarkDotNet结果加上GC和内存分配

从上图可以看到,分别多出Gen 0/Gen 1/Gen 2/Allocated列.

秋风 2019-06-29