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

问题描述:

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

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)上本机速度要慢得多。

+2

您是否启用了任何编译器优化? – kmkim85

+0

不,这是我认为的第一件事,但搜索谷歌没有建议我应该使用任何编译器标志。目前我没有使用标志。我应该使用哪些标志? – HypnoToad

+0

由于JNI调用开销。请看这里 https://stackoverflow.com/questions/13973035/what-is-the-quantitative-overhead-of-making-a-jni-call –

Java on the fly优化可能会使您的循环速度与原生一样快。另一方面,如果没有APP_OPTIM=release,C++编译器将生成调试未优化的代码。

实际上,如果以严谨的方式进行编码,实际上Java中的数字处理可能非常有效。但毕竟,在C中高效地编码也需要纪律。

+0

谢谢,这正是问题所在。我没想到调试版本会比Java代码更慢地减慢本机代码! – HypnoToad