为什么我的本机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)上本机速度要慢得多。
答
Java on the fly优化可能会使您的循环速度与原生一样快。另一方面,如果没有APP_OPTIM=release
,C++编译器将生成调试未优化的代码。
实际上,如果以严谨的方式进行编码,实际上Java中的数字处理可能非常有效。但毕竟,在C中高效地编码也需要纪律。
+0
谢谢,这正是问题所在。我没想到调试版本会比Java代码更慢地减慢本机代码! – HypnoToad
您是否启用了任何编译器优化? – kmkim85
不,这是我认为的第一件事,但搜索谷歌没有建议我应该使用任何编译器标志。目前我没有使用标志。我应该使用哪些标志? – HypnoToad
由于JNI调用开销。请看这里 https://stackoverflow.com/questions/13973035/what-is-the-quantitative-overhead-of-making-a-jni-call –