按配置文件优化
按配置优化可以优化输出文件,其中,优化程序使用的数据是通过对 .exe 或 .dll 文件进行测试运行得到的。 这些数据表示程序在生产环境中可能采用的执行方式。
按配置文件优化仅可用于本机目标:x86、Itanium 处理器系列 (IPF) 或 x64。 对于将在公共语言运行时上运行的输出文件,不能使用按配置优化。 即使生成的程序集包含混合的本机和托管代码(用 /clr 进行编译),也无法仅对本机代码使用按配置优化。 配置优化没有为 windows 中 apps 还支持。 如果您在 IDE 尝试生成设置了这些选项的项时,会发生编译错误。
备注
如果您指定 /Ob、/Os 或 /Ot,则从分析测试运行收集的信息会重写本可以生效的优化。有关更多信息,请参见/Ob(内联函数展开)和/Os、/Ot(代码大小优先、代码速度优先)。
以下是使用按配置优化的过程的概述:
用 /GL 编译一个或多个源代码文件。
对于每个使用 /GL 生成的模块,都可以在按配置优化的测试运行过程中对其进行检查,以捕获运行时行为。 在按配置文件优化生成中,不是每一个模块都需要使用 /GL 进行编译。 不过,只有使用 /GL 编译的模块才会进行检测,供以后用于按配置文件优化。
使用 /LTCG:PGINSTRUMENT 进行链接。
/LTCG:PGINSTRUMENT 会创建一个空的 .pgd 文件。 将测试运行数据添加到该 .pgd 文件后,该文件可以被用作下一个链接步骤(创建优化的映像)的输入。 指定 /LTCG:PGINSTRUMENT 时,可以选择使用 .pgd 文件的非默认名称或位置来指定 /PGD。
配置应用程序。
每当配置的 EXE 会话结束或配置的 DLL 被卸载时,都会创建一个 appname!#.pgc 文件。 .pgc 文件包含特定应用程序测试运行的相关信息。 # 是从 1 开始的数字,基于目录中其他 appname!#.pgc 文件的个数递增。 如果测试运行表示的不是您要优化的方案,您可以删除对应的 .pgc 文件。
在测试运行过程中,您可以使用 pgosweep 实用工具强制关闭当前打开的 .pgc 文件,并创建一个新的 .pgc 文件(例如,当测试方案的结束与应用程序的关闭不同时)。
在分析应用程序时,可以使用 PogoSafeMode 选项。 使用此选项可以指定是以安全模式还是以快速模式对应用程序进行分析。 有关这两种模式的更多信息,请参见 PogoSafeMode。
使用 /LTCG:PGOPTIMIZE 进行链接。
/LTCG:PGOPTIMIZE 创建优化的映像。 此步骤使用 .pgd 文件作为输入。 有关更多信息,请参见 /LTCG:PGOPTIMIZE。
有时候,可能会在创建了优化的输出文件之后发现可以使用附加的配置来创建更为优化的映像。 如果检测到的映像及其 .pgd 文件可用,您可以执行附加的测试运行,并用较新的 .pgd 文件重新生成优化的映像。
以下是按配置优化的列表:
内联 - 例如,如果有一个频繁调用函数 B 的函数 A,而函数 B 相对较小,按配置优化会将函数 B 内联到函数 A 中。
虚调用推理 - 如果某个虚调用或其他通过函数指针的调用频繁指向特定的函数,按配置优化可以将一个按条件执行的直接调用插入这个频繁指向的函数,并且可以内联该直接调用。
寄存器分配 - 用配置文件数据进行优化,可以实现更好的寄存器分配。
基本块优化 - 使用基本块优化,可以将在给定框架内按时间顺序执行的常用基本块放在同一组页面(区域)中。 这可以减少使用的页面数,从而使内存开销最小化。
大小/速度优化 - 对于耗费程序大量时间的函数,可以对其速度进行优化。
函数布局 - 根据调用关系图和配置的调用方/被调用方行为,将倾向于沿相同路径执行的函数放在同一节中。
条件分支优化 - 使用值探测,按配置优化可确定 switch 语句中的给定值是否比其他值更常用。 然后,可从 switch 语句取出此值。 可以对 if/else 指令执行相同的操作;这时,优化程序可以对 if/else 进行排序,根据哪个块为 True 的频率最高,将 if 块或者 else 块放在最前面。
死代码分隔 - 将配置过程中没有调用的代码移到一个特殊的节中,该节附加在一组节的末尾。 这可以有效地将该节排除在常用页面之外。
EH 代码分隔 - EH 代码在发生异常时执行;如果按配置优化可以确定仅在异常条件下才会发生异常,通常可以将这些代码移到一个单独的节中。
内存内部函数 - 如果能够确定是否频繁调用内部函数,就可以更好地确定内部函数的扩展。 也可根据移动或复制的块大小对内部函数进行优化。
有关更多信息,请参见Walkthrough: Using Profile-Guided Optimizations。