新版C#中如何可靠分析源代码生成器的性能?
新版C#源代码生成器性能分析的可靠方法
以下是几种适配现代构建系统的实用性能分析方案,解决参数过长、无法追踪自定义代码的问题:
1. 使用dotnet-trace命令行工具追踪
这是官方推荐的跨平台方案,能完整捕获生成器的执行轨迹:
- 先安装工具:
dotnet tool install --global dotnet-trace - 执行构建并生成追踪文件:
dotnet trace collect --command "dotnet build YourTargetProject.csproj" --output generator-trace.nettrace - 用Visual Studio或
dotnet-trace analyze generator-trace.nettrace打开文件,在调用栈中直接定位你的生成器代码,查看CPU耗时、调用频率等核心数据。
2. Visual Studio性能探查器附加到进程
利用构建过程中生成器运行的子进程,直接附加分析:
- 在生成器代码开头添加
System.Diagnostics.Debugger.Break();,触发断点暂停构建 - 启动构建,当断点触发时,打开Visual Studio的性能探查器(快捷键Alt+F2)
- 选择“CPU使用率”或“.NET内存分配”分析类型,附加到当前暂停的
csc.exe或dotnet.exe进程 - 继续执行构建,探查器会捕获生成器的所有代码执行细节,包括自定义逻辑的耗时分布。
3. 生成器内置性能打点输出
直接在生成器代码中添加轻量级性能日志,无需外部工具:
- 用
Stopwatch记录核心逻辑的执行时间,并通过Diagnostic API输出到构建日志:var watch = Stopwatch.StartNew(); // 你的生成器核心处理逻辑 watch.Stop(); var perfDiag = Diagnostic.Create( new DiagnosticDescriptor( "GENPERF001", "Generator Execution Time", "Generator {0} executed in {1}ms", "Performance", DiagnosticSeverity.Warning, isEnabledByDefault: true ), location: null, GetType().Name, watch.ElapsedMilliseconds ); context.ReportDiagnostic(perfDiag); - 构建时查看日志,就能直接获取每个生成器的执行耗时,快速定位性能瓶颈。
4. MSBuild二进制日志分析
通过MSBuild日志定位生成器在构建流程中的耗时占比:
- 构建时生成二进制日志:
dotnet build YourProject.csproj /bl:build-log.binlog - 用MSBuild Binary Log Viewer打开日志,找到
CoreCompile任务,展开查看生成器相关的执行步骤,对比各阶段耗时,判断生成器是否拖慢整体构建节奏。
内容的提问来源于stack exchange,提问作者user3797758




