当计算机执行PGO测量时,您在计算机上所做的应该不会对优化结果产生任何影响。PGO所做的是使用测量在给定数据集的代码中找到热路径,并使用此信息使程序尽可能快地处理此数据集,哪个路径是热路径,哪个路径不是热路径,并且与计算机上运行的其他程序无关。
要稍微解释一下,优化代码时需要权衡。根据使用的代码转换和应用的位置,代码的某些部分的改进会更高,而其他部分的改进会更低。为了获得更好的最终结果,您需要对执行频繁的代码(编译器行话中的热代码)进行高度改进,而对执行频率较低的代码(冷代码)进行较小的改进。通常使用一组启发式方法来识别程序的这些热门部分,并以尽可能快的方式应用优化。这种方法的问题是,启发式算法不知道程序将如何在实践中使用,可能会将热代码误认为冷代码。
概要文件引导优化(Profile-guideoptimization,PGO)是一种帮助编译器使用实际执行的数据来定位代码的热门部分的方法。作为第一步,您告诉编译器构建程序的插入指令的版本,以测量代码在实际中的执行方式,通常通过添加计数器来计算循环中的迭代次数以及在if语句中选择哪个分支。第二步是在实际数据上运行插入指令的程序。在执行结束时,程序将输出所有添加计数器的值,通过将计数器与代码匹配,可以看到程序的哪些部分是热的(高数值)和哪些部分是冷的(低数值)。最后,程序被编译,但这次与程序概要文件一起使用。这意味着编译器不再需要猜测哪些部分应该更快,哪些部分可能更慢,它可以在概要文件中查找它。