是指利用程序运行过程中采集到的 profile 数据,来重新编译程序以达到优化效果的 post-link 优化技术。其原理认为,对于特征相似的 input,程序运行的特征也相似,因此,我们可以把运行期的 profile 特征数据先采集一遍,再用来指导编译过程进行优化。
-fprofile-instr-generate
完整编译项目default.profraw
文件llvm-profdata merge -output=profile.profdata default.profraw
将采样文件转化成llvm编译认识的指导文件。程序每次运行都会生成新的profraw
文件,如果不指定名称会覆盖上次的default.profraw
,可以使用环境变量LLVM_PROFILE_FILE=${WOKR_DIR}/${PROGRAM_NAME}.profraw
来指定生成的文件名,然后执行llvm-profdata merge -output=profile.profdata *.profraw
来生成profdata文件-fprofile-instr-generate
,添加参数-fprofile-instr-use=${WORK_DIR}/profile.profdata
重新编译项目源码此方案需要CPU支持IBS
-funique-internal-linkage-names
-fdebug-info-for-profiling
,添加链接参数-Wl,--no-rosegment
编译项目源码(-funique-internal-linkage-names
clang9不支持,这里升级到了clang15)perf record -p -e cycles:up -j any,u -a -- sleep 60
,在此期间点击程序常用操作和功能。生成perf.data
文件create_llvm_prof --profile perf.data --binary <运行的可执行程序> --out=llvm.prof
生成llvm.prof
编译指导文件-fprofile-sample-use=llvm.prof
重新编译项目源码