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语言中高效地编码同样需要遵守规则。