Appearance
Benchmark.NET
1. 概述
今天我们来看看如何使用 Benchmark.NET 测量代码性能。使用基准测试,我们可以创建基线来验证所做的更改是否符合预期,并且不会导致性能下降。软件开发通常是一项科学实验。我们就解决问题的最佳方法创建一个假设,编写一些代码,然后运行一个实验来检验这个假设。它是否运行正确、快速(足够),代码是否仍然可维护?在编写每行代码时,我们会多次运行这个小反馈循环。
并不是每个项目都需要基准测试,但是如果您正在开发一个 NuGet 包或者 DLL,那么基准测试非常有意义。例如我们以拼接字符串为例:
csharp
string myString = "string1" + "string2" + "string3" + "string4" + "string5";
Console.WriteLine(myString);1
2
2
然而,我们中的许多人都知道,StringBuilder 被推荐作为一种替代方案,而且速度更快,特别是如果您有很多字符串(我们将其归类为多于三个字符串):
csharp
StringBuilder sb = new StringBuilder();
sb.Append("string1");
sb.Append("string2");
sb.Append("string3");
sb.Append("string4");
sb.Append("string5");
Console.WriteLine(sb.ToString());1
2
3
4
5
6
7
2
3
4
5
6
7
2. 使用 Benchmark.NET
我们怎么做基准测试?让我们创建一个项目,并逐步完成基本步骤。
首先,我们需要创建一个控制台项目:

接下来我们添加 NuGet 包 Benchmark.NET。

然后,在 Program.cs 文件中,我们添加两个 BenchMarkDotNet 的名称空间引用(第 1 行和第 2 行),并将 Program 的可访问性更改为 public(第 8 行)。

现在我们可以创建一些测试。每个测试方法都需要添加 [Benchmark] 特性。我们创建了三个示例:使用 + 运算符、Linq 的 Concat 函数以及 StringBuilder。

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

在 Release 模式下编译并运行项目:
PowerShell
dotnet run -p BenchmarkTesting.app.csproj -c Release这需要几分钟的运行时间。在后台,基准测试工具创建了许多线程/作业,并多次运行测试。为了获得一致的结果,建议最小化打开的应用程序,并且在运行时不执行任何其他操作。输出如下所示,包含了大量的信息:

让我们仔细看看嵌入在最后一张图片中的表格——这是我们的实验结果。由此可见,StringBuilder 比 + 运算符效率高得多。Linq 的 Concat 函数也相对有效,但是无法与 StringBuilder 相比。

3. 总结
基准测试是衡量性能的有用工具。值得注意的是,它并不适用于每个项目,对于测试 NuGet 包或 DLL 来说,这是一个很好的测试方法。但目前还没有一个很好的基准测试用于 DevOps,部分原因是从运行到运行的结果存在可变性,但是请注意这个空间!