如何定位Source Generators性能问题?

前言

在以前的文章中,我们介绍过如何调试Source Generators。但是当实现较为复杂时,我们需要能够快速地分析Source Generators性能的方法。

默认情况下,使用VS 2019自带的“性能探查器”不能分析Source Generators项目,因为它是类库项目:.

如何定位Source Generators性能问题?

如果设置引用Source Generators的目标项目作为启动项目,也不行。因为“性能探查器”只能收集启动时的数据,而不是编译时,而编译时才是Source Generators实际执行的位置。

怎么办?

那就想办法启动编译指令。

获取编译指令

这时就要祭出我们在《你知道MSBuild都干了些什么》使用过的神器——MSBuild Structured Log Viewer

生成日志后,可以看到MSBuild准备执行的所有目标,每个目标中包含多个任务。

我们浏览所有任务,最终可以定位到引用Source Generators的目标项目执行的Task Csc

如何定位Source Generators性能问题?

Csc 任务 - 包装 csc.exe,生成可执行 (.exe) 文件、动态链接库(.dll 文件)或者代码模块(.netmodule 文件) 。有关 csc.exe 的详细信息,请参阅 C# 编译器选项 。

这里的CommandLineArguments就是我们要的编译指令。

设置调试属性

打开Source Generators项目的属性窗口,设置“调试”属性:

如何定位Source Generators性能问题?

  • 启动:可执行文件
  • 可执行文件Task Csc参数CommandLineArguments里的csc.exe全路径
  • 应用程序参数Task Csc参数CommandLineArguments里的csc.exe后面的全内容
  • 工作目录:引用Source Generators的目标项目所在目录

执行性能探查器

将Source Generators项目设为启动项目,然后运行“性能探查器”,勾选“CPU 使用率”,然后点击“开始”按钮。

运行完成后,在打开的报告中就可以查看Source Generators的性能瓶颈了:

如何定位Source Generators性能问题?