桌面应用的性能分析引导优化

性能分析引导优化(PGO)是一种编译器优化技术,它通过利用运行时性能分析数据来生成更高效的原生代码。 使用 PGO 时,编译器会根据应用的实际运行方式重新排列代码,从而提供更好的指令缓存利用率、较小的代码大小和更快的执行速度。

Important

桌面Windows 应用 SDK应用使用标准 MSVC PGO 工作流。 与 UWP 应用不同,桌面应用不需要手动复制到 pgort140.dll 应用包中 - PGO 运行时库通过标准 C/C++ 运行时提供。

PGO 的工作原理

PGO 是一个三步过程:

  1. 插桩 — 在启用插桩的情况下构建您的应用。 编译器插入用于记录代码执行方式的探测。
  2. 配置文件 - 运行检测的应用并练习最重要的方案。 性能分析数据将保存到 .pgc 文件中。
  3. 优化 - 使用分析数据重新生成应用。 编译器根据实际运行时行为优化代码布局、内联和分支。

分步指南

1.配置发布

将解决方案配置设置为 “发布 ”(或生成优化代码的另一个配置)。 PGO 应用于调试版本时没有任何益处。

2. 启用整个程序优化

在项目属性中,转到 C/C++>优化 并验证是否启用了 整个程序优化/GL)。

3. 为构建过程添加检测

转到 链接器>优化 ,并将 “链接时间代码生成 ”设置为 “分析优化 - 检测 ”(/LTCG:PGInstrument)。

构建您的解决方案。 系统会在构建输出的同时生成一个 .pgd 文件。

4. 运行应用程序并收集性能分析数据

运行应用并练习要优化的方案 - 启动、导航、数据处理或任何性能关键型工作流。 在应用运行时,使用 pgosweep.exe 工具(包含在 MSVC 工具集中)收集分析数据:

pgosweep.exe MyApp.exe MyApp!Scenario1.pgc

可以为不同的方案收集多个 .pgc 文件。

5. 合并个人资料数据(可选)

默认情况下,在优化步骤期间,所有放置在 .pgd 文件旁边的 .pgc 文件都会自动合并。 若要以不同的方式对某些方案进行权重,请使用 pgomgr.exe 该工具:

pgomgr.exe -merge:3 MyApp!CoreScenario.pgc MyApp.pgd

这使 CoreScenario 运行的优先级是其他运行的三倍。

6. 优化构建

返回到 链接器>优化 ,并将 “链接时间代码生成 ”设置为 “分析优化 - 优化 ”(/LTCG:PGOptimize)。

重新生成解决方案。 链接器会自动合并所有 .pgc 文件,并根据分析数据生成优化的二进制文件。

实现高效 PGO 的技巧

  • 剖析真实场景。 PGO 优化的质量取决于你的性能分析运行是否具有代表性。 练习用户实际命中的代码路径。
  • 合并多个运行记录。 从多个不同的使用方案收集分析数据,以涵盖广泛的代码路径。
  • 代码发生重大更改时重新分析。 对代码库进行重大更改时,配置文件数据会过时。 定期重新检测和重新分析。
  • 测量影响。 比较 PGO 前后的启动时间、吞吐量和内存使用情况,以验证优化是否值得。