BenchmarkDotNet你值得拥有
起因
不过是在工作中,还是个人在代码书写的过程,在拿不准有个方式更好的时候,通常我们会做一些性能测试.在通过对比性能和那种更让人理解之后做出取舍.以往在做性能对别,我一般用Stopwatch来做,自从发现BenchmarkDotNet后,感觉这个组件非常好用.在微软发布.Net Core时的一些性能测试,也是用BenchmarkDotNet.先看看如何使用吧!1. 安装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测试性能注意事项:
- 项目要使用Release模式,Debug模式是不可以的.
- 类/方法/属性都要public.
- 最好是在命令行运行测试程序.
dotnet run -c release
测试结果:
通过上图,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);
}
}
}
从上图可以看到,分别多出Gen 0/Gen 1/Gen 2/Allocated列.
秋风
2019-06-29