2012.02.11
【Android SDK】マルチスレッド性能テスト
いまさらながら、マルチスレッドの効果の具合が
わからなかったので確認してみます。
ソースはこちら。
Link:ThreadTestプロジェクト
以下の関数を1億回呼び出し終了するまでの時間で計測。
public float length( float x, float y ) { return (x * x) + (y * y); }
上記のスレッドを複数立てて平均速度を結果とします。
チェック機種は「Galaxy S2」
結果がこちら。
スレッド数 | 実行ミリ秒 |
---|---|
1 | 8758 |
2 | 8936 |
3 | 11435 |
4 | 15970 |
5 | 18958 |
10 | 36412 |
1スレッドと2スレッドは差がありますが同じ結果と見てよいです。
それ以降はスレッド数が増えるだけ重くなっていきます。
Galaxy S2はデュアルコアなので2スレッドまでなら重い処理を
分散させることが出来るということでしょう。
1スレッドのときはCPU使用率が50%しか使われていません。
これは1スレッドなので1コアしか使えないからなのでしょう。
そんなわけで「重い処理はスレッドで分散すると早く終わらせられる」
ということがわかったわけです。
NDKは早いとは言うけどどのくらい早いのかがわからなかったので
このタイミングでチェックしてみます。
ソースはこちら。
Link:ThreadTestJni2プロジェクト
やり方はJavaでスレッドを作りJNIでC++をコール。
あとは上記と同じ処理を作成する形です。
結果がこんな感じ。
スレッド数 | SDK版 | NDK版 |
---|---|---|
1 | 8758 | 8411 |
2 | 8936 | 8573 |
3 | 11435 | 12688 |
4 | 15970 | 16738 |
5 | 18958 | 19063 |
10 | 36412 | 42444 |
なんと性能差がほとんどない結果になりました。
下手するとNDK版のほうが遅いくらいです。
まあ、テストプログラムだとあまりにも簡単すぎで
SDKもNDKもほぼ同じ動作だったのでしょう。
これだけじゃガベコレはおきそうにないし
完全な性能比較にはならないです。
だけどJavaでも反復処理であればCPUの性能をフルに生かせる
ということみたいなのでがんばってますねってところでしょうか。
そんな感じでスレッドで処理を分けることでマルチコアCPUを乗った
Androidの機種だと高速に処理できることがあるかもしれません。
Android NDKネイティブプログラミング 出村 成和 秀和システム 2011-07 |
関連記事