CMAKE_BUILD_TYPE发布:奇怪的结果

时间:2017-07-04 09:37:11

标签: android c++ cmake

我们正在创建一个Android应用来比较ART和本机代码之间的执行时间。我们使用Android Studio和CMake编译C / C ++。

在CMakeList.txt中,我们设置标志

set(CMAKE_BUILD_TYPE Release)

在某些算法(Primality Test和Fibonacci)中,所有不同输入的执行时间大幅下降到0ms。

这里是原生的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;
    }

flag是一个标志,当我们终止执行算法的asyncTask时,该标志被设置为true。

我无法想象这是怎么可能的。有什么建议吗?谢谢。

2 个答案:

答案 0 :(得分:0)

这是因为默认情况下,您的CMake项目是使用Debug类型构建的。在此类型中,生成调试信息以及禁用优化(-O0 -g标记到gcc)。

这是为了让您能够逐行执行C ++代码,就像您编写的那样。如果将类型更改为Release,则会启用优化并且二进制文件中不包含调试信息。

优化使代码运行得如此之快,无论你认为你写的东西有多好,编译器仍然领先于你并且会让它变得更好。然而,那些优化将在调试代码时显示不稳定的行为,无序执行的行,或者根本不显示,未在监视中显示或显示错误的变量,这对于调试来说并不好。

缺少的调试信息意味着二进制文件更轻,但是如果你需要调试它更好地练习一些程序集,因为任何有关C ++行导致这些汇编指令的信息都会丢失。另外,如果您确实需要调试优化代码,还有RelWithDebugInfo构建类型。

通常Android Studio应该为您处理适当的构建类型,因此无需使用它。

答案 1 :(得分:0)

您可以使用以下命令转储用于构建C / C ++源文件的编译命令:  set(CMAKE_EXPORT_COMPILE_COMMANDS ON)中的CMakeLists.txt将在构建目录中创建 compile_commands.json

您可以尝试&#34; CMAKE_BUILD_TYPE&#34; 的不同组合,并将生成的compile_commands.json保存为不同的构建类型,以用于不同的编译器标志,以进行优化,调试等。