私たちは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に設定されるフラグです。
これはどのように可能かわかりません。なにか提案を?ありがとうございました。
を異なるビルドの種類の生成compile_commands.jsonを保存することができますか?生成された(アセンブリ)コードを見て、それが何であるかを確認してください。 –
最適化...ループの計算結果を使用していないので、コンパイラはそれを取り除きます – Selvin
これは意味があります、ありがとうございます。コンパイラにフラグを外部的に変更できることを伝える方法はありますか? -1を返すことができるので、ループに入る必要があります –