BenchmarkDotNet 用于 C# (.NET):完整指南及示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

什么是 BenchmarkDotNet,为什么需要它?

\n\n

BenchmarkDotNet 是一个功能强大、跨平台的开源 .NET 库,旨在精确测量代码性能(基准测试)。在软件开发领域,经常需要比较解决同一问题的两种或多种方法:哪种排序算法更快,哪种字符串格式化方式更高效,使用不同数据结构对应用程序运行速度有何影响。BenchmarkDotNet 在专业层面上解决了这个问题。

\n\n

为什么需要它?使用 Stopwatch 手动测量时间存在许多错误风险:后台进程(如 JIT 编译、垃圾回收 (GC))、CPU 缓存预热、系统计时器误差等的影响。BenchmarkDotNet 会自动执行:

\n
    \n
  • 预热 (Warmup): 在测量前多次运行代码,使 JIT 编译器和 CPU 缓存进入稳定状态。
  • \n
  • 多次运行 (Iterations): 多次执行方法并收集统计数据。
  • \n
  • 统计分析: 计算平均值、中位数、标准差、最小和最大时间。
  • \n
  • 隔离: 在单独的进程中运行每个基准测试,以最小化其他测试的影响。
  • \n
  • 诊断: 不仅可以测量时间,还可以测量内存分配 (Allocated)、垃圾回收次数 (GC Collections) 和其他指标。
  • \n
\n

没有 BenchmarkDotNet,您可能会得到不可靠的结果,并对代码优化做出错误的结论。

\n\n

安装 BenchmarkDotNet

\n\n

通过 NuGet 包管理器将 BenchmarkDotNet 库安装到 .NET 项目(C#、F#、VB.NET)中。有三种主要方法:

\n\n

1. 通过 .NET CLI(推荐)

\n

在项目根文件夹中打开终端并执行命令:

\n
dotnet add package BenchmarkDotNet
\n\n

2. 通过 Visual Studio 中的 Package Manager Console

\n

打开菜单 Tools -> NuGet Package Manager -> Package Manager Console 并执行:

\n
Install-Package BenchmarkDotNet
\n\n

3. 通过 Visual Studio 中的 NuGet 图形界面

\n

在 Solution Explorer 中右键单击项目,选择“Manage NuGet Packages”,找到“BenchmarkDotNet”并点击“Install”。

\n\n

重要提示: 为了正确运行,该库要求项目以 Release 配置构建。Debug 配置不会优化代码,会导致结果失真。

\n\n

快速入门及代码示例

\n\n

让我们编写一个简单的基准测试,比较两种字符串拼接方式:使用 + 运算符和 StringBuilder。

\n\n

1. 创建一个新的 .NET 控制台项目:dotnet new console -n MyBenchmark。

\n

2. 安装库:dotnet add package BenchmarkDotNet。

\n

3. 将 Program.cs 文件的内容替换为以下代码:

\n\n
using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\nusing System.Text;\n\npublic class StringConcatenationBenchmark\n{\n    private const int N = 1000; // 方法内部的迭代次数\n\n    [Benchmark]\n    public string UsingPlusOperator()\n    {\n        string result = "";\n        for (int i = 0; i < N; i++)\n        {\n            result = result + "a";\n        }\n        return result;\n    }\n\n    [Benchmark]\n    public string UsingStringBuilder()\n    {\n        StringBuilder sb = new StringBuilder();\n        for (int i = 0; i < N; i++)\n        {\n            sb.Append("a");\n        }\n        return sb.ToString();\n    }\n}\n\npublic class Program\n{\n    public static void Main(string[] args)\n    {\n        var summa                    

推荐