执行该可执行文件,可以产生 default.profraw。 第二阶段是训练阶段,在具体场景下运行程序,前面插入的探针将会记录运行时的信息,数据会被存放在.pgc文件中,每次运行都会产生一个appname! #.pgc的文件,如上图,第一次运行会产生App! 这里没有一个绝对的最优解,同一段代码,在对于不同应用场景的最优排布方式可能是不同的,传统编译方式都是以块代码进行排布和优化。
同时将使用较少的代码挪到最底部,结合下面的“function layout”一起可以显著减少大型应用程序的工作集(一个时间间隔内使用的页面数)。 在开始介绍PGO的过程之前,先介绍一下作为一个编译器,有哪些决定可以去做,并且会怎样影响到程序的效率。 Virtual Call Speculation – 如果一个特定的继承类经常被传递给一个函数,那么它的重载函数可以被inline(内联),这会减少虚表的查询次数。
pgo 直營店: 使用 Profile Guided Optimization 提升 Application 的性能
这就是 Profile Guided Optimization(PGO)发挥作用的地方。 PGO 是一种根据运行时 profiling data 来进行优化的技术。 如果一个 application 的使用方式没有什么特点,那么我们可以认为代码的调用没有什么倾向性。
但实际上,我们操作一个 application 的时候,往往有一套固定流程,尤其在程序启动的时候,这个特点更加明显。 采集这种“典型操作流”的 profiling data,然后让编译器根据这些 data 重新编译代码,就可以把运行时得到的知识,运用到编译期,从而获得一定的性能提升。 然而,值得指出的一点是,这样获得的性能提升并不是十分明显,通常只有 5-10%。 如果已经没有其他办法,再考虑试试 PGO。 同一个 binary 中的不同 object 文件之间,没有强制传染性:A.cpp 和 B.cpp 两个源文件,编译 A 时带着 -fprofile-instr-generate,B 不带着,结果是 A.o 中包含 clang 插入的函数调用(___llvm_xxx), B.o 中没有,链接后的可执行文件中包含 clang 插入的函数调用。
pgo 直營店: 使用 PGO 的经验
Size/Speed Optimization – 根据profile信息,编译器可以找到常用的函数的使用情况,可以将常用的函数进行加速,不常用的函数的代码体积减少。 PGO是一个可以平均提高任何程序5%~8%性能的技术,全称是Profile Guided Optimization,它的思路其实很简单,就是编译器在对变量和函数如何放置排布和使用问题上,其实是有很大的自由权利的。 第3部分是PG优化部分,会将pgc文件合并成pgd文件,被Bakend编译器做决策时提供数据支持,生成更高效的可执行文件。
在这个阶段链接器将cli文件传递给Bakend编译器,Bakend编译器会插入一些探针指令,并且会和可执行文件一起生成一个.pgd文件,这是一个后续其他阶段会用到的数据库文件。 而PGO技术就是自适应编译,通过对程序增加探针进行profile,运行程序之后,再在下一次编译时根据profile结果进行结构的优化调整。 在 Mac 上,必须直接启动可执行文件,才能产生 profraw;若使用 open XXX.app 的方式,则没有 profraw 文件产生。 下面具体说说在 MacOS 上进行 PGO 的一些方法和经验,不过核心知识可以迁移到其他平台,只要使用的编译器是 Clang 即可。 在windows, mac, ad, ios不同平台下的编译工具和使用方式不同,但整体的步骤如前文所述,不同的工具都是这样异曲同工。 Basic Block Reordering(基础结构重新排序) – 尽量将执行顺序最多的路径的代码块放在一起,这样可以提高指令缓存的命中来实现。
pgo 直營店: 编译优化PGO
由香港SEO公司 Featured 提供SEO服務
- #.pgc的文件,如上图,第一次运行会产生App!
- Virtual Call Speculation – 如果一个特定的继承类经常被传递给一个函数,那么它的重载函数可以被inline(内联),这会减少虚表的查询次数。
- 在这个阶段链接器将cli文件传递给Bakend编译器,Bakend编译器会插入一些探针指令,并且会和可执行文件一起生成一个.pgd文件,这是一个后续其他阶段会用到的数据库文件。
- 同时将使用较少的代码挪到最底部,结合下面的“function layout”一起可以显著减少大型应用程序的工作集(一个时间间隔内使用的页面数)。