性能分析引导优化(PGO)是一种编译器优化技术,它通过利用运行时性能分析数据来生成更高效的原生代码。 使用 PGO 时,编译器会根据应用的实际运行方式重新排列代码,从而提供更好的指令缓存利用率、较小的代码大小和更快的执行速度。
Important
桌面Windows 应用 SDK应用使用标准 MSVC PGO 工作流。 与 UWP 应用不同,桌面应用不需要手动复制到 pgort140.dll 应用包中 - PGO 运行时库通过标准 C/C++ 运行时提供。
PGO 的工作原理
PGO 是一个三步过程:
- 插桩 — 在启用插桩的情况下构建您的应用。 编译器插入用于记录代码执行方式的探测。
-
配置文件 - 运行检测的应用并练习最重要的方案。 性能分析数据将保存到
.pgc文件中。 - 优化 - 使用分析数据重新生成应用。 编译器根据实际运行时行为优化代码布局、内联和分支。
分步指南
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 前后的启动时间、吞吐量和内存使用情况,以验证优化是否值得。