Android NDKでJavaとC++の速度を比較してみました

おはようございます。開発部の庄子です。

お仕事で初めてAndroid NDKに触れる機会があり、C++のネイティブコードがJavaコードに比べてどのくらい早いのか知りたいと思って、速度比較の実験してみました。

せっかくなのでブログネタにします。

 

検証環境

  • Mac macOS 10.13
  • Android Studio 2.3.3
  • Gradle 3.3
  • Gradle Plugin 2.3.3
  • JDK 8
  • 端末 Nexus5 (Android 6.0.1)

 

比較した処理

指定した数値以下で、最大の素数を表示する処理を書きました。

あまり効率を考えないでババっと書いたので、あまり中身で叩かないでください…

 

まずネイティブコード(C++)です。

 

次にJavaで書いたコードがこちらです。

booleanのキーワードとJNI関連のコード以外は同じですね。

 

ちなみにJavaから呼び出す処理はこんな感じです。画面に配置したボタンのクリックイベントで計測しています。

(2)の計測時間から(1)の計測時間を引いて、処理時間(ms)を画面に表示します。

変数nativeを切り替えてC++とJavaそれぞれで計測しました。

 

結果

ネイティブ側

 

Java側

 

ネイティブ側が4倍近く早い結果になりました。

正直、ネイティブコード側はJNI呼び出しのオーバーヘッドがあると思うので、軽い処理ではそこまで変わらないのかなと思っていましたが、効果あるようです。

 

今後Androidアプリで速度が求められる処理を書く際、積極的にネイティブコードを活用していきます!(C/C++好きだし)