![JavaとCアプリのパフォーマンス–Garyが説明します](https://i.ytimg.com/vi/TDBTiwjTT0k/hqdefault.jpg)
コンテンツ
最悪のスコアである32ビットAndroid 5.0から始めて、Javaコードの実行速度はCよりも296%遅い、つまり4倍遅いことがわかりました。繰り返しますが、ここでは絶対速度は重要ではなく、同じデバイスでJavaコードを実行するのにかかる時間とCコードを実行する時間の違いは重要ではないことに注意してください。 Dalvik JVMを搭載した32ビットAndroid 4.4 KitKatは、237%で少し高速です。 Android 6.0 Marshmallowにジャンプすると、劇的に改善が始まります。64ビットのAndroid 6.0ではJavaとCの違いが最も小さくなります。
2番目のテストは、部門別トライアルを使用した素数テストです。上記のように、このコードは64ビットを使用します長いです 整数であるため、64ビットプロセッサが優先されます。
予想どおり、64ビットプロセッサで実行されているAndroidから最良の結果が得られます。 64ビットAndroid 6.0の場合、速度の違いは非常に小さく、わずか3%です。 64ビットAndroid 5.0の場合は38%です。これは、Android 5.0上のARTと、 最適化 Android 6.0でARTが使用するコンパイラ。 Android 7.0 Nはまだ開発ベータ版であるため、結果を示していませんが、一般的にはAndroid 6.0 Mと同様にパフォーマンスが向上しています。最悪の結果はAndroidの32ビットバージョンであり、奇妙なことに32ビットAndroid 6.0はグループの最悪の結果をもたらします。
3番目の最後のテストでは、100万回の反復に対して重い数学関数を実行します。この関数は、整数演算と浮動小数点演算を実行します。
そして、ここで初めて、Javaが実際にCよりも速く実行されるという結果が得られました!これには2つの可能な説明があり、両方とも最適化とOに関するものです最適化ARMのコンパイラ。まず、O最適化 コンパイラーは、Android StudioのCコンパイラーよりも、レジスターの割り当てなどにより、AArch64により最適なコードを生成できた可能性があります。より良いコンパイラは、常により良いパフォーマンスを意味します。また、コードを通るパスがあり、O最適化コンパイラが計算した結果は、最終結果に影響を与えないため最適化できますが、Cコンパイラはこの最適化を発見していません。この種の最適化はOの大きな焦点の1つであることを知っています最適化Android 6.0のコンパイラ。この関数は私の純粋な発明であるため、一部のセクションを省略するコードを最適化する方法があるかもしれませんが、私はそれを発見していません。もう1つの理由は、この関数を100万回呼び出しても、ガベージコレクターが実行されないことです。
素数テストと同様に、このテストは64ビットを使用します長いです 整数。次善のスコアが64ビットAndroid 5.0から得られる理由です。次に、32ビットAndroid 6.0、32ビットAndroid 5.0、最後に32ビットAndroid 4.4が続きます。
要約
全体的なCはJavaよりも高速ですが、64ビットのAndroid 6.0 Marshmallowのリリースにより、2つの間のギャップは大幅に縮小されました。もちろん、現実の世界では、JavaとCのどちらを使用するかは白黒ではありません。 Cにはいくつかの利点がありますが、すべてのAndroid UI、すべてのAndroidサービス、およびすべてのAndroid APIはJavaから呼び出されるように設計されています。 Cは、空のOpenGLキャンバスが必要で、Android APIを使用せずにそのキャンバスに描画する場合にのみ実際に使用できます。
ただし、アプリに多少の手間がかかる場合は、これらの部分をCに移植すると、速度が向上する可能性がありますが、かつては見られなかったほどです。