Androidアプリ間連携などで使用できるAIDLの処理時間を調べてみた。
テストに使用したタブレットはNEC N-08D
http://www1.medias.net/jp/sp/n08d/
テストの動作イメージを下図に記載する。
処理1) AIDL経由でバッファ転送処理を100000回繰り返し呼び出す。
処理2) AIDL経由でバッファ転送処理を1度のみ呼び出し、内部で10000回繰り返す。
計測した処理時間は以下のようになった。
処理1 処理2 AIDL実質呼び出し時間
1回目 34.702秒 0.154秒 0.34548ミリ秒
2回目 34.028秒 0.151秒 0.33877ミリ秒
3回目 34.034秒 0.176秒 0.33858ミリ秒
4回目 33.914秒 0.147秒 0.33767ミリ秒
5回目 33.882秒 0.176秒 0.33706ミリ秒
6回目 33.596秒 0.152秒 0.33444ミリ秒
7回目 33.503秒 0.149秒 0.33354ミリ秒
8回目 34.122秒 0.148秒 0.33974ミリ秒
9回目 33.842秒 0.146秒 0.33696ミリ秒
10回目 33.737秒 0.149秒 0.33588ミリ秒
※ AIDL実質呼び出し時間は(処理1時間-処理2時間)/100000で算出した。
この結果から、AIDL経由での呼び出しには約0.33ミリ秒の時間が必要なことがわかる。
一度関数呼び出すだけで0.3ミリ秒かかるということは、Javaだからということを考慮してもかなり遅い。
そこでもう少し考えてみた。
バッファ転送処理はJNI(C++)で128バイトのデータ転送を行っている。
転送のためにGetByteArrayElementsとReleaseByteArrayElementsを呼び出しているため、AIDL呼び出しではなく、実はこの関数ここで時間がかかっているのでは ・・ ?
バッファ転送処理の前後で GetByteArrayElements / ReleaseByteArrayElements関数の呼び出しをなくした処理でテストしてみた。
計測した処理時間は以下のようになった。
処理3 AIDL実質呼び出し時間
1回目 31.241秒 0.31241ミリ秒
2回目 29.703秒 0.29703ミリ秒
3回目 31.627秒 0.31627ミリ秒
4回目 30.118秒 0.30118ミリ秒
5回目 29.386秒 0.29386ミリ秒
6回目 29.331秒 0.29331ミリ秒
7回目 29.221秒 0.29221ミリ秒
8回目 29.567秒 0.29567ミリ秒
9回目 29.377秒 0.29377ミリ秒
10回目 29.992秒 0.29992ミリ秒
※ AIDL実質呼び出し時間は処理3時間/100000で算出した。
これらの結果から128バイト分のGetByteArrayElements/ReleaseByteArrayElementsには0.03ミリ秒程度かかっていること、そしてAIDL呼び出しには0.3ミリ秒が必要ことがわかる。
やはりAIDL呼び出し処理の負荷はかなり大きいことを前提でシステム構築する必要がありそうだ。
実際のソースコードはここに置いている。
ソース一式はこちらから
fifo.zip : バッファ転送を行う処理環境一式
fifotest.zip : AIDL呼び出し側テスト環境一式
4月1日に計測したが、エイプリルフールネタは含まれていない(まじめ)。
0 件のコメント:
コメントを投稿