wrongwrongな開発日記

情報系大学生が挑戦したことや日常を書いていきます

Androidで、C++とJavaの実行速度を少しだけ比較

AndroidC++コードの実行速度とJavaコードの実行速度を少しだけ比較してみました。
この検証に使ったコードは以下に公開しています。
github.com

環境

開発環境 Android Studio2.3
NDKバージョン 14.1.38168.74
実行デバイス(Androidバージョン) SH-02H(6.0.1)

実行したコード

実行したコードは、for文中にif文を挟むコードです。
計測されている時間はミリ秒です。

エミュレータではJavaの方がC++よりも実行速度が速くなったりと実行速度がおかしかったので実機で計測しました。

C++の導入やそのコードの使用方法については省略します。

C++
extern "C"
JNIEXPORT jint JNICALL Java_com_wrongrong_cpptest_MainActivity_cppForTest(JNIEnv* env, jobject obj){
    int i,j;
    j = 0;

    for(i = 0;i < 200000000;i++){
        if(i&1 == 1)j++;
    }
    return j;
}
Java
public class JavaForTest {
    public int javaForTest(){
        int i,j;
        j = 0;

        for(i = 0; i < 200000000; i++){
            if((i&1) == 1)j++;
        }
        return j;
    }
}
検証用コード
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView tv = (TextView) findViewById(R.id.sample_text);
    String ln = System.lineSeparator();
    JavaForTest jft = new JavaForTest();
    int i,j=0;
    long jftS,jftE,cppS,cppE;

    for(i = 0;i < 200000000;i++)j += i;

    jftS = System.currentTimeMillis();
    i = jft.javaForTest();
    jftE = System.currentTimeMillis();

    cppS = System.currentTimeMillis();
    j = cppForTest();
    cppE = System.currentTimeMillis();

    //出力の整形
    StringBuilder sb = new StringBuilder(String.valueOf(i - j)); sb.append(ln);
    sb.append("Java:"); sb.append(String.valueOf(jftE - jftS)); sb.append(ln);
    sb.append("C++:"); sb.append(String.valueOf(cppE - cppS)); sb.append(ln);
    sb.append("Java/C++:"); sb.append(String.valueOf((double)(jftE - jftS) / (double)(cppE - cppS)));

    tv.setText(sb.toString());
}
脚注

実行速度安定化のための空ループを挟んでみたが、挟まない方がC++Java両方に関して、実行速度は高速でした。
一方、ループを挟まない場合、先に実行した方のコードの実行速度が速くなる傾向がありました。
レジスタの関係でしょうか?

実行結果

JavaC++に対して大体13倍ほど実行速度が遅いという結果になりました。
プログラム実行速度の計測に関して余り知識が無いので何とも言えませんが、やはりリアルタイム処理のような高速性の求められる処理では、C++を用いて処理を行った方が良いのでしょう。