我将我的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)本机代码要慢得多。
答案 0 :(得分:2)
Java即时优化可以使您的循环与本机一样快。另一方面,如果没有APP_OPTIM=release
,C ++编译器将生成调试未优化代码。
如果以纪律的方式编码,实际上Java中的数字运算可能非常有效。但毕竟,在C中有效编码也需要纪律。