我把我的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示例项目相同。一个典型的运行结果是NITE=2580毫秒,Java=195毫秒。什么可以使本机代码运行得比Java慢得多?
编辑:顺便说一下,本地代码在模拟器上运行得比Java快得多,但是在我的手机上(LG V20/SnAPHANGO 820),原生速度要慢得多。
您启用了任何编译器优化吗?
不,这是我想的第一件事,但是搜索谷歌并没有建议我使用任何编译器标志。目前我没有使用任何标志。我应该使用哪些标志?
因为JNI呼叫开销。请参见stackoverflow.com/questions/13973035/&hellip;
也许它仍然被优化了,尝试在返回语句中具体化结果,然后再次测试。而@denisdda,jni调用开销小于1毫秒,所以这不应该是问题。
你应该对它进行微标记,这样循环可能会被优化掉。
问题既不是JNI开销,也不是循环优化。两个循环所用的时间与循环计数成线性比例。我在这里发布的代码只是一个测试,试图找出为什么我的实际物理循环运行较慢。我将尝试使用其他NDK样本进行更多的基准测试,看看它们在C中的运行速度是否也较慢。
为什么要创建然后丢弃一个std::string?你不能只用return env->NewStringUTF("Hello from C++");而不是浪费额外的动态(de)分配吗?
ndk确实提供了一个分析工具:developer.android.com/ndk/guides/simpleperf.html
@没用,那只是从原始的Helloandroidjni样本中遗留下来的。我删除了那部分代码,它不会影响结果。我正在更新这里的代码以反映更改。
JavaOffice优化可以使您的循环与原生一样快。另一方面,如果没有EDCOX1(0),C++编译器将生成调试未优化的代码。
事实上,在爪哇,数字编码可能是相当有效的,如果以纪律的方式编码。但毕竟,在C语言中高效地编码同样需要遵守规则。
谢谢,这正是问题所在。我没想到调试构建会比Java代码更慢地降低原生代码!