跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C#AI

Copilot Profiler Agent 辅助分析代码性能瓶颈

综述由AI生成介绍如何使用 Copilot Profiler Agent 优化 CsvHelper 项目性能。通过自然语言指令让 AI 生成基准测试并分析结果,识别出委托调用开销为性能瓶颈。Agent 建议将多个委托组合为单个块表达式进行编译,从而减少调用次数。实测性能提升约 24%,有效降低了 CPU 时间消耗。该工具结合精确性能数据与 AI 分析能力,加速了测量与优化的循环。

霸天发布于 2026/3/28更新于 2026/6/119 浏览

在 Visual Studio 中,推出了 Copilot Profiler Agent,这是一款新的人工智能驱动的助手,可帮助您分析和优化代码中的性能瓶颈。通过将 GitHub Copilot 的功能与 Visual Studio 的性能分析器相结合,您现在可以用自然语言询问有关性能的问题,深入了解热点路径,并快速发现优化机会。以下是一个实际案例。

对实际项目进行基准测试

为了展示 Copilot Profiler Agent 的功能,我们对开源项目 CsvHelper 进行优化。操作步骤如下:克隆代码仓库分支,然后通过'git checkout 435ff7c'命令切换到修复之前的版本。

此前项目中已添加了一个 CsvHelper.Benchmarks 项目,其中包含用于读取 CSV 记录的基准测试。本次目标是优化 CSV 记录的写入。通常,我会通过为想要优化的代码创建基准测试来开始这项研究,不过我们可以让 Copilot 来承担这些繁重的工作。在 Copilot 聊天窗口中,我可以问@Profiler '帮我为 #WriteRecords 方法编写一个基准测试'。@Profiler 让我们直接与 Copilot Profiler Agent 对话,而 #WriteRecords 则明确告诉它我们要进行基准测试的方法。

1

从这里开始,Copilot 着手创建我们的新基准测试,它会询问我们是否可以安装分析器的 NuGet 包,以便在运行基准测试时从中提取信息。它还会根据找到的任何现有基准测试来构建新的基准测试模型,因此生成的基准测试与我们已经编写的非常相似,从而保持与存储库风格的一致性。最后,它会启动构建过程,以确保一切正常。

2

完成后,它会提供一些有用的后续提示来启动调查。我们可以点击其中一个来展开调查,不过我对基准测试做了些调整。

3

我对基准测试做了些调整,增加了几个供我们写入的字段,这里具体是 2 个整数字段和 2 个字符串字段。最初让 Copilot 来做这件事时,它每次都是写入一个新的内存流,而不是同一个内存流。写入同一个内存流或许是更好的做法。

public class BenchmarkWriteCsv { private const int entryCount = 10000; private readonly List<Simple> records = new(entryCount); public class Simple { public int Id1 { get; set; } public int Id2 { get; set; } public string Name1 { get; set; } public string Name2 { get; set; } }
[GlobalSetup]
public void GlobalSetup() {
    var random = new Random(42);
    var chars = new char[10];
    string getRandomString() {
        for (int i = 0; i < 10; ++i) chars[i] = (char)random.Next('a', 'z' + 1);
        return new string(chars);
    }
    for (int i = 0; i < entryCount; ++i) {
        records.Add(new Simple { Id1 = random.Next(), Id2 = random.Next(), Name1 = getRandomString(), Name2 = getRandomString(), });
    }
}
[Benchmark]
public void WriteRecords() {
    using var stream = new MemoryStream();
    using var streamWriter = new StreamWriter(stream);
    using var writer = new CsvHelper.CsvWriter(streamWriter, CultureInfo.InvariantCulture);
    writer.WriteRecords(records);
    streamWriter.Flush();
}
}

深入了解基准测试

现在开始分析,我既可以让 Profiler Agent 运行基准测试,也可以直接点击后续提示"@Profiler Run the benchmark and analyze results"。从这里开始,Copilot 会编辑主方法,乍一看可能有些奇怪,但查看所做的更改后,我发现它为了使用 BenchmarkSwitcher 进行了必要的修改:

static void Main(string[] args) {
    // Use assembly-wide discovery so all benchmarks in this assembly are run,
    // including the newly added BenchmarkWriteRecords.
    _ = BenchmarkSwitcher.FromAssembly(typeof(BenchmarkEnumerateRecords).Assembly).Run(args);
}

然后它启动了一次基准测试运行,完成后会给我一个诊断会话,我可以在其中开始调查。

使用 Copilot Profiler Agent 来查找瓶颈

现在到了令人兴奋的部分。运行基准测试后,Profiler Agent 会分析跟踪信息,并突出显示时间的消耗位置。我可以向 Profiler Agent 询问有关跟踪的问题,让它解释代码为什么运行缓慢,或者某些优化为何会有帮助。它已经指出,大部分时间都花在委托编译和调用上,这是针对 CSV 记录中的每个字段进行的。对于一个有 4 个字段、被写入 10,000 次的记录来说,这意味着会有 40,000 次委托调用。每次调用都有开销,而这在分析器中显示为一个热点路径。

6

我可以问 Profiler Agent:'我怎样才能减少委托调用的开销?'或者'为什么委托调用很慢?',而它会像一位耐心的老师一样解释相关概念并提出修复建议。

实施修复方案

我点击 @Profiler Optimize library to produce a single compiled write delegate (reduce multicast invokes),看看会得到什么结果。Profiler Agent 会对 ObjectRecordWriter 进行编辑,我可以在聊天窗口中点击它来查看所做更改的差异。

查看当前的实现,代码构建了一个委托列表,每个字段对应一个委托:

var delegates = new List<Action>();
foreach (var memberMap in members) {
    // ... field writing logic ...
    delegates.Add(Expression.Lambda<Action>(writeFieldMethodCall, recordParameter).Compile());
}
var action = CombineDelegates(delegates) ?? new Action((T parameter) => { });
return action;

问题在于 CombineDelegates 会创建一个多播委托,该委托会依次单独调用每个独立的委托。相反,Profiler Agent 建议我们在编译前使用 Expression.Block 来组合所有表达式:

var expressions = new List<Expression>(members.Count);
foreach (var memberMap in members) {
    // ... field writing logic ...
    expressions.Add(writeFieldMethodCall);
}
if (expressions.Count == 0) {
    return new Action<T>((T parameter) => { });
}
// Combine all field writes into a single block
var block = Expression.Block(expressions);
return Expression.Lambda<Action<T>>(block, recordParameter).Compile();

这一改动虽小却很精妙:我们没有创建多个委托并按顺序调用它们,而是创建了一个包含所有字段写入操作的单个块表达式,然后对其进行一次编译。现在,当我们为每条记录调用委托时,所有字段都会在一次调用中完成写入,不存在额外的委托开销。

衡量影响

做出这一更改后,Copilot 会自动重新运行基准测试以衡量改进效果。结果显示,在此次使用分析器的运行中,性能大约提升了 24%。我们之前为 CsvHelper 准备的分阶段拉取请求显示性能提升了约 15%。CPU 分析器证实,我们已经消除了委托调用的开销,对于每条有 4 个字段的 10,000 条记录,之前需要进行 40,000 次委托调用,而现在只需要 10,000 次委托调用。

9

对于一个已经经过大量优化的库来说,这是一场意义重大的胜利。对于那些编写包含许多字段的大型 CSV 文件的应用程序而言,这一改进直接意味着 CPU 时间的减少和处理速度的提升。而且,由于 CsvHelper 的下载量高达数百万次,这项优化惠及了大量用户。在此基础上,继续推进并提交拉取请求,Copilot 贴心地提供了更多关于类型转换和 ShouldQuote 逻辑的后续提示,以便能进一步提升性能。

Copilot Profiler Agent 的价值

这个工作流程之所以强大,是因为它将 Visual Studio Profiler 提供的精确性能数据与 Copilot 的分析和代码生成能力相结合。无需手动深入研究 CPU 跟踪并试图理解热点路径的含义,而是可以提出自然语言问题,获取可执行的见解,并快速测试想法。

该 Agent 不仅会告诉您哪些部分运行缓慢,还会帮助您理解其缓慢的原因,并提出具体的修复方法。在这种情况下,它识别出委托调用的开销是瓶颈,并建议采用 Expression.Block 优化,这正是解决该问题的正确方案。它甚至还重新运行了基准测试来确认该优化的效果!

目录

  1. 对实际项目进行基准测试
  2. 深入了解基准测试
  3. 使用 Copilot Profiler Agent 来查找瓶颈
  4. 实施修复方案
  5. 衡量影响
  6. Copilot Profiler Agent 的价值
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 弗洛伊德 - 沃舍尔算法 (Floyd-Warshall Algorithm)
  • GitHub Copilot 实战:Python 开发中的 AI 辅助技巧
  • Python 办公自动化实战:Excel、Word 与 PPT 批量处理指南
  • OpenVLA 架构解析:基于 Prismatic VLM 与下一个 Token 预测的动作生成
  • Milvus 实战:Attu 可视化安装与 Python 整合指南
  • ASR 自动语音识别原理与 Whisper 模型详解
  • ASR 自动语音识别技术与 Whisper 模型详解
  • Windows 权限提升:自动化枚举方法
  • NUC 迷你主机配合 OpenClaw 构建家庭 AI 助理
  • GitHub Copilot Agent 模式实战技巧与注意事项
  • 手机端去除豆包 AI 视频水印的几种方案
  • WorkBuddy 接入 QQ 机器人配置指南
  • VSCode 常用 AI 编程助手插件推荐与实战
  • Git LFS 跨平台安装指南:Linux、macOS 与 Windows 配置详解
  • Python Wheel 包 (.whl) 安装指南与常见问题处理
  • MySQL 数据类型详解:从数值到字符串的实战指南
  • Spring Web MVC 从入门到实战
  • 激光雷达外参标定算法详解
  • IntelliJ IDEA 集成 GitHub Copilot 完整教程:从安装到实战技巧
  • 2026 年 3 月 GESP C++ 一级真题解析:数字替换

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online