Android PGO Guide

Part 1 采集數(shù)據(jù)
  1. 在fio的Android.bp加入下面的code.
pgo: {
    instrumentation: true,
    benchmarks: [
        "fio",                      // benchmarks可以理解為當(dāng)前優(yōu)化的workload的名字.
    ],
    profile_file: "fio.profdata",   // fio.profdata表示會去toolchain/pgo-profiles下面尋找該文件.
}
  1. make fio ANDROID_PGO_INSTRUMENT=fio
  2. 運(yùn)行binary/library, 它會在/data/local/tmp下面生成profraw的文件
# build/soong/cc/pgo.go
const profileInstrumentFlag = "-fprofile-generate=/data/local/tmp"
  1. llvm-profdata merge -output=fio.profdata default_xxxxxx.profraw
    注意llvm-profdata需要用Android prebuild的版本, 位于./prebuilts/clang/host/
    llvm-profdata show -all-functions fio.profdata // 可以dump profile信息, 可以通過function id將default_xxx.profraw和具體的library/binary對應(yīng)起來.
Part 2 使用profile來優(yōu)化
  1. 把profdata放到toolchain/pgo-profiles
  2. make fio // 不設(shè)置ANDROID_PGO_INSTRUMENT的話, 它就不會插入profile的代碼.
  3. run
PS:
  1. 進(jìn)程會在exit的時(shí)候dump profile, 收到signal 9的時(shí)候并不會dump.
    所以如果是要優(yōu)化長期存在的service, 需要做些hack.
# external/compiler-rt/lib/profile/InstrProfilingFile.c
int __llvm_profile_register_write_file_atexit(void) {
  1. 假設(shè)已經(jīng)帶上ANDROID_PGO_INSTRUMENT編譯過libc了. 但是你在make別的庫的時(shí)候, 沒有加這個(gè)變量, 同時(shí)這個(gè)庫引用過libc, 那也會引起libc的重編譯
  2. 可以通過nm或者objdump來驗(yàn)證opted library是否符合預(yù)期.
    (hot的method排列在相鄰的VMA上)
nm -n [lib_name]

參考: https://source.android.com/devices/tech/perf/pgo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容