Android NDK vs SDK vs iPhone

環境


カルマコアラはまだ「目覚めている」ので、MacOSで書き込みます。
Eclipse Galileo、Android SDK 1.6r1およびNDK 1.6r1がインストールおよび構成されています。
HTC Magic(32A)のみが手元にあるため、NDK 1.5で記述します。
このテストは、ゲームをiPhoneからAndroidに移植する前に、土壌を「テスト」することを目的として書かれています。

テスト中


次のオプションがテストとして採用されました。

なぜそう選択するのですか?
10 ^(-15)の精度で区間(-10; 10)の方程式Y = 3 * cos(2 * x-4)に対して「半除算法」が選択されました。
このデバイスには浮動小数点計算を高速化するコプロセッサーがないため、JavaからJNIに切り替えることで作業が向上するかどうかを確認するのは興味深いものでした。 もう1つは、大量のデータと「メソッド」の呼び出しが多数あることです。 大量のデータがあるコンパートメントで再帰をチェックするために、迅速な並べ替えが行われました;再帰を避けるために、シェルアルゴリズムが採用されました。 特にデータを操作するパフォーマンスをテストするには、配列反転を使用します。
JNIとJavaの「メソッド」を呼び出すコストを見積もるために、ダミーメソッドを10,000回呼び出します。
並べ替えには、事前に作成された10,000個の要素のint配列を使用します。
結果は、シミュレーター(2.4GHz Intel Core 2 Duo)、HTC Magic(32A、1.5、コア2.6.29 + bfs)、およびiPhone3G(3.1)で得られました。 すべてのテストメソッドは純粋なCで作成されました。

結果


シミュレーター


-QSSSスワップDiv2空の
JNI(シム)1059025373569921033913895
JAVA(シム)100650457341678613344837745
シム%89.4894.4591.1137.12-79.41

*%-Java JNIの動作速度をパーセントで示します

HTC Magic(32A 1.5、2.6.29-myhero-bfs)


-QSSSスワップDiv2空の
ジニ74691171398801091978885
Java63569290291259592132785193
88.2595.9685.2348.8-71.1

*%-Java JNIの動作速度をパーセントで示します

Androidプラットフォームの時間はjava.lang.System.nanoTime()関数を使用して撮影され、iPhoneの場合はmach_absolute_time()を使用しました。
各テストは30回実行され、結果は平均化されました。 最初の結果は、明らかにJavaの仕様が原因で一般的な指標から外れたため、スキップされました。
結果からわかるように、NDKは大量のデータを処理する場合に非常に効果的です。「数学」をJNIに転送する場合にも大きな増加が見られます。マイナスは呼び出しの「価格」です。
シミュレーター

HTC Magic
HTC Magic
そして今、iPhoneと比較して、奇跡を待つべきではありません...

iPhone


-QSSSスワップDiv2空の
HTC Magic JNI74691171398801091978885
iPhone335311310358182022405769
77.7391.0651.65-387.38-1055.4

*%-MagicがiPhoneから動作する速度をパーセントで示します

この図は半除算法を示していません。これは、浮動小数点演算アクセラレーションコプロセッサを搭載したiPhoneが単純にMagicを無効にすることがわかっているためです(結果からわかります)。 iPhoneコンパイラは「そのようなコード」を最適化するため、ダミーメソッドも削除されます。
iPhone
結果はただ私を襲った。 数学とコード最適化でのみ失われます。 新しいデバイスのリリースにより、最初の問題は解決されると思います。

iPhoneおよびAndroidのソースをテストします。
PS電話機にファームウェア1.6をインストールできるようになり次第、OpenGL比較を実施します。

Source: https://habr.com/ru/post/J72883/


All Articles