添加打印
在選擇開(kāi)機(jī)模式的時(shí)候,想要統(tǒng)計(jì)不同的方式被調(diào)用的次數(shù),那么就需要通過(guò)打log的方式對(duì)各種模式進(jìn)行統(tǒng)計(jì)
-
編譯執(zhí)行到機(jī)器碼打印
文件路徑:./art/compiler/optimizing/optimizing_compiler.cc
打點(diǎn)函數(shù):OptimizingCompiler::TryCompile()
TryCompile是dex2oat的重要部分绎狭,負(fù)責(zé)從DEX指令碼到機(jī)器碼的生成灌侣。在該函數(shù)底部添加如下的打印
-
JitCompiler
文件路徑:./art/compiler/jit/jit_compiler.cc
打點(diǎn)函數(shù):JitCompiler::CompileMethod()
這條打印主要是針對(duì)JitCompile的調(diào)用。如果需要生成機(jī)器碼卖陵,JitCompile函數(shù)必然會(huì)調(diào)用上面的TryCompile函數(shù)遭顶。這里并沒(méi)有將打印添加到JitCompile函數(shù)里面而是該函數(shù)被call之后,是想驗(yàn)證如果我們之后disable了JIT編譯泪蔫,就不應(yīng)該看到仍然JitCompile被調(diào)用棒旗;另一方面我們也可以和TryCompile的打印統(tǒng)計(jì)進(jìn)行比較。
-
JniCompile
文件路徑:./art/dex2oat/driver/compiler_driver.cc
打點(diǎn)函數(shù):CompileMethodQuick()
這條打印主要針對(duì)JniCompile的調(diào)用撩荣。因此铣揉,對(duì)于純解釋執(zhí)行,我們不希望它被call餐曹。該打印添加到JniCompile被call之后逛拱。
-
解釋執(zhí)行的打印添加
文件路徑:./art/runtime/interpreter/interpreter_switch_impl-inl.h
打點(diǎn)函數(shù):ExecuteSwitchImplCpp()
當(dāng)一個(gè)JAVA方法以CPP解釋方式執(zhí)行時(shí),該函數(shù)將被ART虛擬機(jī)調(diào)用台猴。
-
匯編解釋執(zhí)行的打印添加
文件路徑:./art/runtime/interpreter/interpreter.cc
打點(diǎn)函數(shù):Execute()
當(dāng)一個(gè)JAVA方法以匯編解釋方式執(zhí)行時(shí)朽合,該函數(shù)將會(huì)調(diào)用ExecuteMterpImpl函數(shù)。目前只能在匯編函數(shù)外部添加打印饱狂。
選擇c++/匯編解釋執(zhí)行的方式
文件路徑:./art/runtime/interpreter/interpreter.cc
匯編解釋執(zhí)行:
#if ART_USE_CXX_INTERPRETER
static constexpr InterpreterImplKind kInterpreterImplKind = kSwitchImplKind;
#else
static constexpr InterpreterImplKind kInterpreterImplKind = kMterpImplKind;
#endif
C++解釋執(zhí)行
#if ART_USE_CXX_INTERPRETER
static constexpr InterpreterImplKind kInterpreterImplKind = kSwitchImplKind;
#else
static constexpr InterpreterImplKind kInterpreterImplKind = kMterpImplKind;
#endif
統(tǒng)計(jì)次數(shù)
需要在生成的log中抓取各個(gè)字符串出現(xiàn)的次數(shù)曹步,腳本如下:
#!/bin/sh
#names=$(cat ./names.log)
echo "文件名:$1";
echo "OptimizingCompiler::TryCompile()";
grep -c "ZJH:Trycompile() is called!!! " $1
echo "JitCompile()";
grep -c "ZJH: JitCompile() is called!!! " $1
echo "JniCompile()";
grep -c "ZJH:Jnicompile() is called!!! " $1
echo "ExecuteSwitchImplCpp()";
grep -c "ZJH: ExecuteSwitchImplCpp() is called!! " $1
echo "ExecuteMterpImpl()";
grep -c "ZJH: ExecuteMterpImpl() is called!!! " $1
-
由于加入了大量的打印,需要給log區(qū)擴(kuò)容嗡官,emulator啟動(dòng)后首先可以通過(guò)adb logcat -g查看緩沖區(qū)的大小箭窜,再通過(guò)adb logcat -G 256m將緩沖區(qū)的大小更改為256M
- 配置完緩沖區(qū)的大小之后,重新開(kāi)機(jī)衍腥,首先抓取log
adb logcat > bootup.log
-
啟動(dòng)完成之后執(zhí)行腳本統(tǒng)計(jì)各個(gè)方法被調(diào)用的次數(shù)