项目中需要用到性能测试,发现.net 平台的这个神器. 具体参考官方介绍
做基线对比测试不是那么容易,你很容易就翻车掉坑里,BenchmarkDotNet 会帮你避坑(即使你是老司机),它会帮你干很多体力活,比如它会针对每个benchmark方法生成独立的工程项目,并启动这些单独的工程,迭代多次运行benchmark方法(包括测试前的热身)等。通常,你不需要关注这些benchmark方法的迭代次数,BenchmarkDotNet 会根据它的经验选中合适的迭代次数。
有了BenchmarkDotNet,做性能对比测试就非常容易了,只需要把你的测试方法加上特性[Benchmark], 想做不同.net平台的性能测试,比如传统的 .NET Framework, .NET Core, and Mono,这些都没问题,加一个特性就会把面向不同平台的测试工程生成出来,随后运行后将会生成不同平台的性能对比结果。可以这么说,它可以测试对比任何不同的测试环境,比如 不同的处理器架构(x86/x64)、不同的JIT编译器(LegacyJIT/RyuJIT)、不同的垃圾回收机制(如服务器/工作站),除此之外,同时还可以引入不同的输入参数(一个或者几个),对比其它条件相同而参数不同时候的性能对比。
BenchmarkDotNet 不仅仅是帮你运行benchmark方法,还帮你分析生成的结果:它会生成不同形式的报表,它的结果报表都是统计分析出来的,它不会一下子给你很多眼花缭乱的数据,但是会给你很关键的性能对比数据。当然,如果你在某些条件下对其它的统计数据感兴趣,你可以手动的通过添加Attribute的方式来定制结果报表。
说了这么多,上个例子:
using System; using System.Security.Cryptography; using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Running; namespace MyBenchmarks { [ClrJob(baseline: true), CoreJob, MonoJob, CoreRtJob] [RPlotExporter, RankColumn] public class Md5VsSha256 { private SHA256 sha256 = SHA256.Create(); private MD5 md5 = MD5.Create(); private byte[] data; [Params(1000, 10000)] public int N; [GlobalSetup] public void Setup() { data = new byte[N]; new Random(42).NextBytes(data); } [Benchmark] public byte[] Sha256() => sha256.ComputeHash(data); [Benchmark] public byte[] Md5() => md5.ComputeHash(data); } public class Program { public static void Main(string[] args) { var summary = BenchmarkRunner.Run<Md5VsSha256>(); } } }