Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的母语是C++;在Android上运行的代码比Java慢得多?_Java_Android_C++_Performance_Android Ndk - Fatal编程技术网

为什么我的母语是C++;在Android上运行的代码比Java慢得多?

为什么我的母语是C++;在Android上运行的代码比Java慢得多?,java,android,c++,performance,android-ndk,Java,Android,C++,Performance,Android Ndk,我把我的java代码的一些部分移植到C++上,加快了Android的计算速度(这是一个物理子程序)。我发现本机代码的运行速度比Java代码慢好几倍。我认为我的项目的配置可能有问题,或者数组处理可能有问题,所以我在HelloAndroidJni项目中放了一个简单的循环来测试原始速度差,得到了类似的结果 Java代码: @Override protected void onCreate(Bundle savedInstanceState) { /* ...generic boilerplat

我把我的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;
}
intjavatest(int计数){
int结果=0;
for(int i=0;i

和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;
}
JNIEXPORT jint JNICALL
Java_com_friencode_helloandroidjni_main activity_nativeTest(
JNINEV*env,jobject(这是一个,jint计数){
int结果=0;
for(int i=0;i
项目的其余部分与HelloAndroidJni示例项目相同。典型运行的结果是Native=2580 ms,Java=195 ms。是什么让Native代码运行得比Java慢这么多


编辑:顺便说一句,本机代码在模拟器上的运行速度比Java快得多,但在我的手机(LG V20/Snapdragon 820)上,本机代码的运行速度要慢得多。

Java动态优化可能会使您的循环与本机代码一样快。另一方面,没有<代码> AppyOpTime=发布< /C> > C++编译器将生成调试未优化代码。
值得注意的是,如果以规范的方式编码,Java中的数字处理实际上可能非常有效。但毕竟,用C高效地编写同样的代码也需要纪律。

您启用了任何编译器优化吗?没有,这是我想到的第一件事,但搜索Google并没有建议我使用任何编译器标志。目前我没有使用任何标志。我应该使用哪些标志?因为JNI调用开销。看这里,也许它仍然被优化了,尝试在return语句中包含结果并再次测试。而且@DenisDda,JNI调用开销小于1ms,所以这应该不是问题。你应该正确地标记它,循环可能会被优化掉。谢谢,这正是问题所在。我没想到调试版本会比Java代码慢这么多本机代码!