首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android如何比CLang C/С++编译器(Android )更高效地编译Java?

Android如何比CLang C/С++编译器(Android )更高效地编译Java?
EN

Stack Overflow用户
提问于 2021-05-06 17:58:10
回答 1查看 445关注 0票数 1

我完全相信C\C++本机代码将比Java代码运行得更快。事实的确如此。我的简单C/C++基准( int阵列上的随机算术操作)运行速度比老平板电脑(三星GalaxyTabE-Android4.4.4-DalvikVM)上相同的Java代码快5-7倍,但在最近使用arithmetic K3 Muze (Android8.1)和三星S21 Ultra (Android11)的设备上运行得更慢。

为什么Android编译代码比本地C/C++代码(Android / JNI)运行得更快?

Java代码

代码语言:javascript
复制
public void calculateJava(int size) {
    int[] array = new int[size];
    int sum = 0;

    for (int i=0; i<size; i++) {
        array[i] = i;
        for (int j=0; j<size; j++) {
            sum += array[i] * array[j];
            sum -= sum / 3;
       }
    }    
 }

C/C++代码

代码语言:javascript
复制
extern "C" JNIEXPORT void JNICALL Java_com_axiom_firstnative_MainActivity_calculateNative(
        JNIEnv* env,
        jobject,
        jint size) {

    int* array = new int[size];
    jint sum = 0;

    for (jint i=0; i<size; i++) {
        array[i] = i;
        for (jint j=0; j<size; j++) {
            sum += array[i] * array[j];
            sum -= sum / 3;
        }
    }

    // delete[] array;
}

OnClick (爪哇)

代码语言:javascript
复制
     long startTime = System.nanoTime();
     calculateNative(4096);
     long nativeTime = System.nanoTime() - startTime;
                
     startTime = System.nanoTime();
     calculateJava(4096);
     long javaTime = System.nanoTime() - startTime;
                
     String report = "VM:" + System.getProperty("java.vm.version")
                        + "\n\nC/C++: " + nativeTime 
                        + "ns\nJava: " + javaTime + "ns\n"
                        + "\nJava to C/C++ ratio " 
                        + ((double) javaTime / (double) nativeTime);

结果

三星Galaxy Tab E(Android4.4.4)- Java时间:2166748 ns,C/C++时间: 396729 ns (C/C++ 5倍)

Prestigio K3 Muze (Android8.1)第一次启动- Java时间:3477001ns,C/C++时间:547692 40 (C/C++ 6倍),但经过热身之后,Java运行速度提高了30-40%。

三星Galaxy S21 Ultra (安卓11) - Java时间:111000 up,C/C++时间:121269 up (Java在第一次启动时快9%,热身后快40-50%!!)

打开CLang编译器优化选项(-O3)使C/C++运行速度比Android优化快30-35%(Android8.1)。但是,在上,Android11ART优化代码的运行速度比CLang C/C++优化(-O3)原生代码快10-20%。太令人震惊了.

附注:这两个基准测试在一个线程上依次运行,因此我认为它们使用相同的核心。

问题

Android如何编译比CLang编译器更高效的本机代码?

在最近的Android操作系统版本上编写本地C/C++代码有什么性能优势吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-09 03:43:53

如何编译比CLang (Android ) C/C++编译器更高效的本机代码?

是JIT编译器对ART当前先进(AOT)编译器的补充,并提高了运行时性能。

尽管JIT和AOT使用相同的编译器来进行类似的优化,但是生成的代码可能并不相同。JIT利用运行时类型信息可以进行更好的内联,并使堆栈替换(OSR)编译成为可能,所有这些都会生成略有不同的代码。

在最近的Android版本上编写本地C/C++代码有什么性能优势吗?

当然,对于旧的Android设备来说。旧的Android设备使用Dalvik来解释代码。Java代码将比Dalvik上相同的C/C++代码慢5-7倍。但是在大多数情况下,Android运行时概要文件引导编译基于应用程序执行统计数据生成的本地代码效率要高得多,但Java仍然比Android8.1上的优化C/C++代码慢30%-35%,在Android 11上比优化C/C++代码慢10-20%。

https://source.android.com/devices/tech/dalvik/jit-compiler

结论:在我看来,在为最近的安卓设备编写C/C++代码(从v7.0本体技术VM开始)方面没有任何性能优势,除非你是一个经验丰富的C/C++开发人员,并且对CPU架构有很深的理解,所以你可以比Android做得更好。

此外,Android (C/C++)仍然是Android开发人员实现以下目标的唯一途径:

  1. 将您的本地C/C++代码移植到Android。
  2. 使用C/C++游戏引擎和库(例如Vulkan或平台专用的APIs,在Android.中不可用)。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67423616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档