簡體   English   中英

為什么我的原生C ++代碼比Android上的Java運行速度慢得多?

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

我將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)本機代碼要慢得多。

Java即時優化可以使您的循環與本機一樣快。 另一方面,如果沒有APP_OPTIM=release ,C ++編譯器將生成調試未優化代碼。

需要注意的是,如果以規范的方式編碼,實際上Java中的數字運算可能非常有效。 但畢竟,在C中有效編碼也需要紀律。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM