[英]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.