当前位置 博文首页 > SpringLeee:使用 Benchmark.NET 测试代码性能

    SpringLeee:使用 Benchmark.NET 测试代码性能

    作者:SpringLeee 时间:2021-02-15 22:31

    今天,我们将研究如何使用Benchmark.Net来测试代码性能。借助基准测试,我们可以创建基准来验证所做的更改是否按预期工作并且不会导致性能下降。

    并非每个项目都需要进行基准测试,但是如果您正在开发的是NuGet程序包或通用dll,则很有意义。我们将使用它来解决一个古老的问题,字符串拼接,比如下面这样:

    string myString = "string1" + "string2" + "string3" + "string4" + "string5";
    Console.WriteLine(myString);
    

    我们很多人都知道建议使用StringBuilder作为替代方法,并且速度要快得多,特别是在您有很多字符串的情况下。

    StringBuilder sb = new StringBuilder();
    sb.Append("string1");
    sb.Append("string2");
    sb.Append("string3");
    sb.Append("string4");
    sb.Append("string5");
    Console.WriteLine(sb.ToString());
    

    Benchmark.NET

    首先,我们需要创建一个控制台项目,BenchmarkTesting.App

    接下来,我们添加NuGet包 BenchmarkDotNet

    然后,修改 program.cs文件中,把可访问性改成 public

    现在我们可以创建一些测试方法,我们直接修改program.cs, 每个测试方法都需要 [Benchmark] 特性,我创建了三个示例,分别使用+运算符,Linq的Concat函数和使用StringBuilder拼接。

    最后,在控制台应用程序的Main入口点中,添加 BenchmarkRunning Run命令:

    然后我们使用下边的命令运行测试,或者直接使用VS启动项目,需要切换到Release模式下

    dotnet run -p BenchmarkTesting.app.csproj -c Release
    

    运行大约需要几分钟,基准测试工具在后台创建大量线程/作业并多次运行测试,为了获得一致的结果,建议最小化打开的应用程序,并且在运行时不要执行任何其他操作,输出如下所示,其中包含很多信息。

    单位"us"是"μs"或微秒的缩写,一微秒等于一毫秒的1/1000。

    由此可见,StringBuilder要比+运算符效率更高,Linq Concat函数也相对高效,但还是没有StringBuilder快。

    总结

    拼接字符串时使用StringBuilder! 本篇文章只是简单作的做了介绍,Benchmark.NET是测试性能的非常强大的工具,如果需要构建Nuget包,或者开发通用类库时,这将是一种很好的测试方法。

    原文链接: https://samlearnsazure.blog/2021/01/12/measuring-code-performance-with-benchmark-net/

    最后

    欢迎扫码关注我们的公众号 【全球技术精选】,专注国外优秀博客的翻译和开源项目分享,也可以添加QQ群 897216102

    bk