可以使用分析工具在 Visual Studio 中收集和查看 BenchmarkDotNet 数据。 BenchmarkDotNet 是一个开源 .NET 库,专为性能基准测试而设计。 它以可靠且可重复的方式自动测量和比较 .NET 代码的执行时间、内存使用情况和其他性能指标的过程。
要使用 BenchmarkDotNet,您需要在项目中安装所需的 NuGet 包,并将相应的属性添加到与您感兴趣的性能信息类型相匹配的代码中。
先决条件
Visual Studio 2022 版本 17.9 或更高版本
基准项目必须包含以下两个 NuGet 包:
如果使用基准项目模板,则创建项目时会存在这些 NuGet 包。
设置你的项目
必须将基准属性添加到 .NET 控制台应用程序。 可以将属性添加到引用其他项目类型的包装函数。
若要为 BenchmarkDotNet 支持准备项目,请使用以下方法之一:
打开现有控制台项目或创建新的控制台项目。 在此方案中,手动添加 BenchmarkDotNet 支持。
使用 基准项目 模板。 仅当你手动添加 BenchmarkDotNet 支持时,才需要本文中所述的一些步骤。
基准项目模板生成完全集成的 BenchmarkDotNet 项目,其中包含对 CPU 使用情况分析和 Copilot 见解的内置支持。 若要使用模板,请在创建新项目时从项目类型列表中选择 “分析 ”,然后选择 “基准项目”。 有关属性的信息,请参阅 代码的属性。
创建控制台项目或使用现有控制台项目。
必须将基准属性添加到 .NET 控制台应用程序。 可以将属性添加到引用其他项目类型的包装函数。
为代码添加归属信息
将 BenchmarkDotNet 诊断程序作为属性添加到基准类时,可将应用配置为在基准测试运行后生成 .diagsession 文件。 然后,可以在 Visual Studio 中打开 .diagsession 文件,并查看基准的分析数据。
支持以下诊断程序:
- CPUUsageDiagnoser
- 数据库诊断器
- DotNetCountersDiagnoser
- EventsDiagnoser
- FileIODiagnoser
每个诊断程序都会生成与该诊断程序相关的性能数据。 例如,CPUUsageDiagnoser 生成一个 .diagsession 文件,其中包含 CPU 数据,DatabaseDiagnoser 生成一个 .diagsession 文件,其中包含数据库作上的数据。 这些限制对应于相关的分析工具。 例如,探查器的数据库工具适用于 ADO.NET 或 Entity Framework Core。
为诊断器和基准测试添加代码属性:
将诊断程序名称作为属性添加到包含要为其生成数据的基准的类。
将
Benchmark属性添加到要测试性能的方法。例如,可以将以下代码用于 CPUUsageDiagnoser。
如果使用 基准项目 模板,则模板中已提供示例代码。 如果要手动添加 BenchmarkDotNet 支持,可以使用以下示例代码。
using System; using System.Security.Cryptography; using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Running; using Microsoft.VSDiagnostics; namespace MyBenchmarks { [CPUUsageDiagnoser] public class Md5VsSha256 { private const int N = 10000; private readonly byte[] data; private readonly SHA256 sha256 = SHA256.Create(); private readonly MD5 md5 = MD5.Create(); public Md5VsSha256() { 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(typeof(Program).Assembly); } } }
收集和查看 Benchmark.NET 数据
请将构建设置为 发布 版本,而不是调试版本。
运行应用程序以生成 .diagsession 文件。
检查控制台输出以获取文件的位置。 例如:
// * Diagnostic Output - VSDiagnosticsDiagnoser * Collection result moved to 'BenchmarkDotNet_Md5VsSha256_20231218_123326.diagsession'. Session : {7f38bcc2-c692-4266-aa24-b12bc5325ea4} Stopped Exported diagsession file: *.diagsession在 Visual Studio 中,选择 “文件 > 打开 > 文件 ”并导航到 .diagsession 文件的位置,然后选择并打开该文件。
选择“ 基准” 选项卡以查看 BenchmarkDotNet 基准的数据。
有关 “基准” 选项卡中的结果的详细信息,请参阅 BenchmarkDotNet 文档。
右键单击结果中的行,然后选择 “选择时间范围 ”以将时间线图与基准同步。
选择可用选项卡之一,例如 CPU 使用率 或 分配。
根据用于收集数据的诊断程序,可以获得与内存分配、CPU 使用率、计数器和其他性能数据相关的见解。 若要分析内存分配,请通过添加 [MemoryDiagnoser] 属性来使用内置工具 MemoryDiagnoser。 有关详细信息,请参阅 诊断程序。
注释
性能分析器仅支持 [MemoryDiagnoser] 和本文前面列出的诊断工具。
有关使用探查器分析内存分配的示例,请参阅博客文章 “使用 Visual Studio Profiler 进行基准测试”。
若要分析与其他选项卡(如 CPU 使用情况)相关的数据,请参阅分析文档中的相应文章。
使用 Copilot 进行优化
可以使用 CodeLens 直接从编辑器触发 BenchmarkDotNet 基准的 CPU 和内存分配优化。 这使性能调优更加易用且无缝,帮助你在编码过程中直接找到并解决 CPU 和内存分配问题。
选择基准上方的 CodeLens 指示器,然后选择“ 使用 Copilot 优化分配”选项。