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

Why is my native C++ code running so much slower than Java on Android?

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

Java代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@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中的循环:

1
2
3
4
5
6
7
8
9
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++代码:

1
2
3
4
5
6
7
8
9
10
11
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示例项目相同。一个典型的运行结果是NITE=2580毫秒,Java=195毫秒。什么可以使本机代码运行得比Java慢得多?

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


JavaOffice优化可以使您的循环与原生一样快。另一方面,如果没有EDCOX1(0),C++编译器将生成调试未优化的代码。

事实上,在爪哇,数字编码可能是相当有效的,如果以纪律的方式编码。但毕竟,在C语言中高效地编码同样需要遵守规则。