如何定位Source Generators性能问题

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何定位Source Generators性能问题相关的知识,希望对你有一定的参考价值。

前言

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

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

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

怎么办?

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

获取编译指令

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

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

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

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

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

设置调试属性

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

  • 启动:可执行文件

  • 可执行文件Task Csc参数CommandLineArguments里的csc.exe全路径

  • 应用程序参数Task Csc参数CommandLineArguments里的csc.exe后面的全内容

  • 工作目录:引用Source Generators的目标项目所在目录

执行性能探查器

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

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

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“

以上是关于如何定位Source Generators性能问题的主要内容,如果未能解决你的问题,请参考以下文章

折腾了半天的linux generators上编译报错问题定位

究竟是什么可以比反射还快实现动态调用?| Source Generators版

Source Generators实现简版AutoMapper

Hello Blazor:Source Generators生成导航菜单

抽丝剥茧!Source Generators原理讲解

.NET Core开发实战(定义API的最佳实践)Source Generators版