最近有一篇关于 VS 17.8 更新 的文章宣传了这种行为,但我无法看到视频中可见的“基准”选项卡。
我当前正在运行 Visual Studio Community 17.8.358。
下面是我正在运行的(相当简单)基准。我通过转到“调试 -> 性能分析器”来运行它,选择一些基准测试(例如 CPU 使用率)并让它运行。它在 Release 中运行基准测试,符合预期,但不显示 BenchmarkDotNet 结果。
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Diagnosers;
using BenchmarkDotNet.Running;
namespace MyBenchmarks;
public class Foo
{
}
public class Foo<T> where T : Bar
{
}
public class Bar
{
}
[MemoryDiagnoser]
public class SpecificActivatorVsNew
{
[Benchmark]
public object ActivatorCreateInstance() => Activator.CreateInstance(typeof(Foo));
[Benchmark]
public object NewOperator() => new Foo();
}
public class Program
{
public static void Main(string[] args)
{
BenchmarkRunner.Run<SpecificActivatorVsNew>();
}
}
不幸的是,关于此功能何时真正准备就绪,存在一些误解,因此它最近才公开发布。为了创建具有基准测试选项卡的诊断会话,您需要将特定的 BenchmarkDotNet 诊断程序添加到您的项目中,以便在基准测试运行时启用给定的分析工具。将此诊断程序添加到基准测试中后,您无需像分析普通项目时那样单独启用或运行分析工具 - 每次基准测试运行时,即使它完全来自命令行且完全在 Visual Studio 之外,如果启用了这些诊断程序之一,则会对基准进行分析并创建诊断会话。包含 Visual Studio 分析工具的这些诊断程序的 nuget 包可以在此处找到:https://www.nuget.org/packages/Microsoft.VisualStudio.DiagnosticsHub.BenchmarkDotNetDiagnosers,并包含有关如何设置其用法的自述文件。为了方便起见,我在这里复制了当前自述文件的内容:
此 nuget 包允许您将诊断程序添加到 BenchmarkDotNet 基准测试函数中,从而允许您使用 Visual Studio 中的性能分析工具来分析基准测试。
您可以在此处找到有关 BenchmarkDotNet 的更多信息:https://benchmarkdotnet.org/
您可以在这里找到有关 BenchmarkDotNet Diagnosers 的信息:https://benchmarkdotnet.org/articles/configs/diagnosers.html?q=diagnoser
为了使此 nuget 包中的诊断程序正常工作,您必须在运行基准测试的计算机上安装 Visual Studio 17.9 Preview 1 或更高版本。您还可以使用 Visual Studio 远程工具的等效版本 - 有关远程工具的更多信息可以在此处找到:https://learn.microsoft.com/en-us/visualstudio/debugger/remote-debugging
我们目前在此 nuget 包中提供以下诊断程序:
每个诊断器将生成一个可以在 Visual Studio 中打开的 .diagsession 文件,其中包含与该诊断器相关的性能数据(例如,CPUUsageDiagnoser 提供包含 CPU 数据的诊断会话文件,DatabaseDiagnoser 提供包含数据库数据的诊断会话文件)操作等)
要将诊断程序添加到基准中,您可以将诊断程序名称作为属性添加到包含要为其生成诊断会话的基准的类中。例如下面的类:
[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);
}
运行时将创建一个诊断会话文件,其中包含两个基准函数运行(Sha256 和 Md5)的 CPU 使用数据。
BenchmarkDotNet 运行完成后,输出中将有几行说明诊断会话的输出位置。例如,使用上面的内容将为输出提供类似的内容:
// * 诊断输出 - VSDiagnosticsDiagnoser * 收集结果移至“BenchmarkDotNet_Md5VsSha256_20231218_123326.diagsession”。 会话:{7f38bcc2-c692-4266-aa24-b12bc5325ea4} 已停止 导出的诊断文件:
“导出的诊断会话文件”将包含生成的诊断会话文件的完整路径
不幸的是,我们希望尽快解决一些已知问题,但目前会阻碍此功能的使用,而这些问题目前未在自述文件中反映出来:
我们仍在积极开发此场景,除了修复错误之外,还计划在不久的将来提供更多功能,因此如果您有任何反馈或建议,请随时在此处或通过 https://developercommunity.visualstudio 告诉我们。 com/home(或通过 Visual Studio 中的“发送反馈”功能)