为什么我的原生C ++代码运行速度比Android上的Java慢得多?

时间:2017-09-28 01:08:52

标签: java android c++ performance android-ndk

我将我的Java代码的一些部分移植到C ++以加速Android上的计算(这是一个物理子程序)。我发现原生代码的运行速度比Java代码慢几倍。我想我的项目配置可能有问题,或者可能是数组处理错误,所以我在HelloAndroidJni项目中设置一个简单的循环来测试原始速度差异,并得到类似的结果。

Java代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    /* ...generic boilerplate code... */

    TextView tv = (TextView) findViewById(R.id.sample_text);
    int loopCount = 100000;

    //time the native method
    long ticks = System.nanoTime();
    int result = nativeTest(100000);
    long nativeTime = (System.nanoTime() - ticks) / 100000;

    //time the Java method
    ticks = System.nanoTime();
    result = javaTest(100000);
    long javaTime = (System.nanoTime() - ticks) / 100000;

    //present results
    tv.setText("Native=" + nativeTime + "; Java=" + javaTime);
}

Java中的循环:

int javaTest(int count) {
    int result = 0;
    for (int i = 0; i < count; i++) {
        for (int j = 0; j < 100; j++) {
        result += 34432; result++;
        result -= 34431; result--;
    } }
    return result;
}

和C ++代码:

JNIEXPORT jint JNICALL
Java_com_fringecode_helloandroidjni_MainActivity_nativeTest(
        JNIEnv *env, jobject jThis, jint count) {
    int result = 0;
    for (int i = 0; i < count; i++) {
        for (int j = 0; j < 100; j++) {
            result += 34432; result++;
            result -= 34431; result--;
        } }
    return result;
}

项目的其余部分与HelloAndroidJni示例项目相同。典型运行的结果是Native = 2580 ms,Java = 195 ms。什么可能使本机代码运行速度比Java慢得多?

编辑:顺便说一下,本机代码在模拟器上比Java运行得快得多,但在我的手机上(LG V20 / Snapdragon 820)本机代码要慢得多。

1 个答案:

答案 0 :(得分:2)

Java即时优化可以使您的循环与本机一样快。另一方面,如果没有APP_OPTIM=release,C ++编译器将生成调试未优化代码。

如果以纪律的方式编码,实际上Java中的数字运算可能非常有效。但毕竟,在C中有效编码也需要纪律。