java运行速度不如c_为什么我的原生C ++代码比Android上的Java运行速度慢得多?

我把我的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代码更慢地降低原生代码!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值