はじめに
http://code.google.com/p/android-ndk-profiler を使用して profile をとってみます
詳細については [Usage] (http://code.google.com/p/android-ndk-profiler/wiki/Usage)をご参照ください。
変数の定義
$PATH_TO_ANP
: 展開した android-ndk-profiler をおいたディレクトリへのパス
$LIBNAME
: ライブラリ名
$PATH_TO_PROJECT
: プロジェクトディレクトリへのパス
環境設定
ダウンロードと展開
ここから現在最新の android-ndk-profiler-v3.2.zip を取得
$ cd $PATH_TO_ANP
$ unzip android-ndk-profiler-v3.2.zip
Android.mk の編集
プロファイルを取りたいライブラリの Android.mk に android-ndk-profiler をリンクするための記述をする
LOCAL_CFLAGS := -pg
LOCAL_STATIC_LIBRARIES := android-ndk-profiler
Android.mk 末尾に下記を追加
$(call import-add-path,$PATH_TO_ANP)
$(call import-module,android-ndk-profiler)
使い方
プロファイルを取りたい箇所を monstartup と moncleanup で囲むだけ
#include <prof.h>
/* 測定開始*/
monstartup("$LIBNAME");
/* 何らかの処理*/
/* 測定終了*/
moncleanup();
結果の取得
プログラム実行後 /sdcard/gmon.out
として結果が出力されます。
$ adb pull /sdcard/gmon.out
Android Application のプロセスから実行する場合 AndroidManifest.xml に下記の記載が必要になります。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
解析
下記コマンドで確認できます。
$ arm-linux-androideabi-gprof $PATH_TO_PROJECT/obj/local/armeabi(-v7a)/$LIBNAME gmon.out
おまけ
graphviz と Gprof2Dot を使うと簡単に可視化できました。
$ arm-linux-androideabi-gprof $PATH_TO_PROJECT/obj/local/armeabi(-v7a)/$LIBNAME gmon.out | gprof2dot.py | dot -Tpng -o output.png