You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

新版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.exedotnet.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

火山引擎 最新活动