前回のエントリーについた、はてブのコメントで、TraceViewでの結果が知りたい、というリクエストが上っていたので、TraceViewを使って計測してみた。
というかその前にTraceViewを知らなかったので、まずはその解説から。
TraceViewとは
グラフィカルなログビュアーの事で、これを知る事でデバッグの助けや、どこで処理時間がかかっているかパフォーマンスを視覚的に確認できるツール。
TraceViewの詳細は別エントリーで解説するつもり(説明する量はそんなに多くはないが)
TraceView対応版
前回はシステム時刻を利用して時間計測を行ったが、それをTraceViewに対応させた。
package com.example.android.ndkbench; import android.app.Activity; import android.graphics.Point; import android.os.Bundle; import android.os.Debug; import android.util.Log; import android.widget.TextView; public class MainActivity extends Activity { private TextView textView; private String TAG = this.getClass().getName(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textView = (TextView)findViewById(R.id.textview); int cnt = 0; long loopcnt = 10000000; // javaで足し算 long sum = 0; Debug.startMethodTracing("ndkbench1"); for (int i = 0; i < loopcnt; i++){ sum += 1; } Debug.stopMethodTracing(); String text = " sum:"+sum+"\n"; // ダミーの呼出 sum = 0; for (int i = 0; i < loopcnt; i++){ sum += getInt(); } text += "dummySUM:"+sum + "\n"; // int getInt() sum=0; Debug.startMethodTracing("ndkbench2"); for (int i = 0; i < loopcnt; i++){ sum += getInt(); } Debug.stopMethodTracing(); text += " sum:"+sum + "\n"; // int addInt() sum=0; Debug.startMethodTracing("ndkbench3"); for (int i = 0; i < loopcnt; i++){ sum += addInt(1,1); } Debug.stopMethodTracing(); text += "sum:"+sum + "\n"; textView.setText(text); } public native int getInt(); public native int addInt(int i,int j); static { System.loadLibrary("bench-jni"); } }
結果
これらの結果は、HTC Desire + Android 2.2(Froyo)での結果
ndkbench1
ndkbench2
ndkbench3
Android 1.6でもベンチマーク
JITでNDKの関数がinline化されている、とコメントがあったので、手元のGDDPhone(HT-03A相当) + Android 1.6(Donuts)でも試してみた。
利用したソースコードは先のものと全く同じ
bench1
bench2
bench3
結論(とそれにまつわる謎)
処理時間だけ比較してみると、こんな感じになった。
Froyo
計測エリア | 処理時間 |
---|---|
bench1 | 18875.428 |
bench2 | 3061.951 |
bench3 | 3066.589 |
Donuts
計測エリア | 処理時間 |
---|---|
bench1 | 15386.413 |
bench2 | 10581.513 |
bench3 | 10492.401 |
となった。以前の調査結果と異なりJavaによる演算より、NDKを利用したループによる演算の処理時間の方が早いという結果になったのだが。これはどう考えたらいいのだろう?
その他、これらの結果から読み取れる事があれば教えてください m(__)m