2017-07-04 29 views
1

私たちはAndroidアプリケーションを作成して、ARTとネイティブコードの実行時間を比較しています。私たちはC/C++のコンパイルにAndroid StudioとCMakeを使用しています。 CMakeList.txtに、我々は、実行時間が大幅にすべての異なる入力に対しては0msにドロップいくつかのアルゴリズム(素数テストおよびフィボナッチ)のフラグCMAKE_BUILD_TYPEリリース:奇妙な結果

set(CMAKE_BUILD_TYPE Release) 

を設定

ここでネイティブのlib

bool flag = false; 

extern "C" JNIEXPORT void JNICALL Java_javacpp_cmr_com_sdkvsndk_MainActivity_cancel(JNIEnv *env, jobject obj) { 
     flag = true; 
    } 


extern "C" JNIEXPORT jlong JNICALL Java_javacpp_cmr_com_sdkvsndk_MainActivity_primalityTest(JNIEnv *env, jobject obj, jlong r) { 
    if(r < 0) return -1L; 
    timeval start, stop; 
    long long t; 
    gettimeofday(&start, NULL); 

    bool prime = true; 

    unsigned long long sr = (unsigned long long) sqrt(r); 
    for (unsigned long long i = 2; (i < sr) && prime; i++) { 
     if (flag) return -1; 
     if (r % i == 0) prime = false; 
    } 

    gettimeofday(&stop, NULL); 
    t = (stop.tv_sec - start.tv_sec) * 1000; 
    t += (long long) ((stop.tv_usec - start.tv_usec)/1000) 
    return (jlong) t; 
    } 

フラグは、我々はアルゴリズムを実行asyncTaskを終了したときにtrueに設定されるフラグです。

これはどのように可能かわかりません。なにか提案を?ありがとうございました。

+2

を異なるビルドの種類の生成compile_commands.jsonを保存することができますか?生成された(アセンブリ)コードを見て、それが何であるかを確認してください。 –

+2

最適化...ループの計算結果を使用していないので、コンパイラはそれを取り除きます – Selvin

+0

これは意味があります、ありがとうございます。コンパイラにフラグを外部的に変更できることを伝える方法はありますか? -1を返すことができるので、ループに入る必要があります –

答えて

0

これは、デフォルトでCMakeプロジェクトがDebugタイプでビルドされているためです。このタイプでは、デバッグ情報が生成され、最適化は無効になります(-O0 -g gccへのフラグ)。

これは、あなたが書いたように、行ごとにC++コードをステップインすることを可能にするためです。タイプをReleaseに変更すると、最適化がオンになり、デバッグ情報がバイナリに含まれなくなります。

最適化を行うと、コードをすばやく実行できるようになります。何か書いたと思っても、コンパイラはまだ先に進んでいます。しかし、これらの最適化では、コードがデバッグされたり、行が順不同で実行されたり、まったく実行されなかったり、変数がウォッチに表示されたり間違って表示されたりすると、

欠落しているデバッグ情報はバイナリが軽いことを意味しますが、デバッグする必要がある場合は、C++のどの行にこれらのアセンブリ命令が失われたかについての情報があるため、また、実際に最適化されたコードをデバッグする必要がある場合に備えて、RelWithDebugInfoビルドタイプもあります。

通常、Androidスタジオは適切なビルドタイプを処理する必要があります。そのため、これを行う必要はありません。ビルドディレクトリ内compile_commands.jsonを作成しますCMakeLists.txtset(CMAKE_EXPORT_COMPILE_COMMANDS ON)

0

あなたは、コンパイル使用してC/C++のソースファイルをビルドするために使用されるコマンドをダンプすることができます。

あなたは「CMAKE_BUILD_TYPE」のさまざまな組み合わせを試してみて、そのための最適化のデバッグなど、最適化のための異なるコンパイラフラグのため