我们正在创造一个Android应用程序来比较ART和本地代码之间的执行时间。我们正在使用Android Studio和CMake编译C/C++。CMAKE_BUILD_TYPE发布:奇怪的结果
当CMakeList.txt我们设置标志
set(CMAKE_BUILD_TYPE Release)
在一些算法(素性测试和斐波那契)的执行时间急剧下降为0ms所有不同的输入。
这里的本地库
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的标志。
我不知道这是如何可能的。任何建议?谢谢。
因为优化的?查看生成的(汇编)代码以查看它的功能。 –
优化...你没有使用循环的计算结果,所以编译器摆脱它 – Selvin
这是有道理的,谢谢。有一种方法可以告诉编译器该标志可以在外部修改吗?所以它必须进入循环,因为它可以返回-1 –