在 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 则明确告诉它我们要进行基准测试的方法。

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

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

我对基准测试做了些调整,增加了几个供我们写入的字段,这里具体是 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; } Id2 { ; ; } Name1 { ; ; } Name2 { ; ; } }
[]
{
random = Random();
chars = [];
{
( i = ; i < ; ++i) chars[i] = ()random.Next(, + );
(chars);
}
( i = ; i < entryCount; ++i) {
records.Add( Simple { Id1 = random.Next(), Id2 = random.Next(), Name1 = getRandomString(), Name2 = getRandomString(), });
}
}
[]
{
stream = MemoryStream();
streamWriter = StreamWriter(stream);
writer = CsvHelper.CsvWriter(streamWriter, CultureInfo.InvariantCulture);
writer.WriteRecords(records);
streamWriter.Flush();
}
}



