你的位置:首页 > 资讯热点 » 正文

华为鸿蒙操作系统会不会比谷歌的Android更快?

2019-06-18 | 人围观 | 评论:

目前,关于华为鸿蒙操作系统网络上议论纷纷,本文将从计算机编译角度对鸿蒙操作系统可能的性能做一些通俗的解释。

1.代码编译

1.1编译流程

大家都知道,计算机最终执行的代码都是“10101010”二进制的,而程序员所写的代码都是“源代码”,所以,为了让“源代码”变成“可执行的程序”,计算机提供了“编译”功能。通俗的说,就是把“源代码”转换为二进制的“1010”。这种编译并不仅仅是“翻译”这么简单,还有复杂的逻辑检验、错误提示,代码合并等等。

在实际软件开发中,软件通常会比较大,例如chrome浏览器,大约有4000万行代码,这个代码不会是在一个文件里,而是分成不同的项目,最后,再把所有项目整合起来,形成一个最终的exe。

下图显示的普通程序编程流程图。展示2个开发人员分别写了2个程序c++程序,姑且叫做a.cpp和b.cpp,通过编译为a.obj和b.obj,再通过链接生成了 main.exe

1.2 什么叫编辑

编辑(edit)代码即编写代码,是编程的第一步。你可以任意一个编辑器进行代码的编写。你可以使用 Windows 自带的“记事本”来编写代码,也可以使用Notepad++,或者 Visual Studio,Eclipse等 提供的编辑器。

使用记事本写代码

虽然可以使用记事本软件编辑代码,但是记事本软件的功能非常有限。缺少常用的语法高亮,自动缩进等功能。所以可以使用其他功能更丰富的编辑器,如Notepad++等。

1.2 什么叫编译

编译(compile)是将用某种编程语言(如上面的C++语言)写成的源代码,转换成目标文件。目标文件包含着机器代码(可直接被计算机中央处理器CPU执行,请注意这句话,后面我们会详细讨论它)以及代码在运行时使用的数据。编译器(compiler)是实现这一目的的软件。编译器有很多,如在 Windows 下有微软公司的 cl.exe,在 Linux 下有 gcc 和 g++。在命令行下使用 cl.exe 对 hello.cpp 源代码进行编译,如下图显示的代码编译后,生成了目标文件hello.obj

1.3什么叫链接?

连接(link)是将多个目标文件,以及库文件生成可执行的文件(或静态库、或动态库)的过程。连接器(linker)是实现这一目的的软件。常用的连接器有Windows 下的 link.exe,Linux 下的 ld 等。在 Windows 下可以使用 link.exe 将前面生成的 hello.obj 连接为可执行文件--最终生成了hello.exe

1.4 什么叫运行

运行(run)较容易理解,我们在 Windows 资源管理器里用鼠标双击 exe 可执行程序,可以使程序被载入 CPU 运行。我们也可以在命令行窗口中输入可执行程序的文件名运行,如下图。

通过上面1-4步骤的介绍,最终您编写的源代码变成了CPU可以直接执行的1010二进制代码。现在,你大致了解了程序是怎么开发的。

2.Java虚拟机

传统软件人员在使用C/C++编写程序时,是需要考虑到硬件特征的,这是因为不同的操作系统对代码的定义并不相同。例如一个整数(以下假设仅供说明):如果8位的windows提供的最大整数是:

而8位Linux提供的最大整数是

这种代码的差异,使得程序员在编写程序时,需要对硬件和操作系统平台有深刻的认识,阻碍了软件业的发展。

在这个时候Java诞生了。Java给出了自己的解决方案:Java虚拟机。

Java虚拟机是在源代码和CPU之间,建立一个“虚拟的层”。程序员在写代码时,使用Java提供的“虚拟代码”(注意:这里仅是举例,方便理解。)

是的,源代码里定义的变量并不是写死的,后期,windows和Linux分别安装Java虚拟机,由虚拟机来最终生成你定义的数据。

当程序员编写的代码需要运行时,就分两步:

第一步:Java虚拟机加载程序员编译后的代码

第二部:CPU加载Java虚拟机代码

通过这种“两步加载”的方式,实现了程序员编写一个程序,可以在不同的操作系统上运行。因为有Java虚拟机来帮助你做“底层”的映射。

如果总结一下就是:

3.JIT和AOT

在上一步可以看到CPU无法直接加载Java源代码,这导致了“安卓程序”总是不如“苹果程序”流畅。因此,如果能把Java直接语言翻译成 CPU 能理解的机器语言就好了。这时,出现了.JIT和AOT。

在 Android 5.0 正式采用 ART 之前,Android 采用的是 解释执行 + JIT 的方式执行 Java代码。在这个阶段是货真价实的「边解释边执行」的模式,代码效率相当低下,再加上那时候同样差的 GC (垃圾回收),Android 用起来真是惨不忍睹。

Android 5.0 ~ Android 6.0 。Google 推出了 ART (Android Runtime)来解决之前的 Java 代码执行效率问题。这个阶段采用的是完全 AOT 模式;Android 应用在安装的时候,系统会把所有Java代码提前编译为机器码。这种模式有两个缺点不能忍:

Android 7.0 ~ 现在。Google做了很大的改进,基于这样一个事实:我们使用一个应用的时候,基本每个人只使用它一小部分功能,为什么要把所有代码全编译呢?只编译你经常用的那部分代码不就 OK 了,这样安装的时候啥也不干速度飞快,等你用的时候系统就能知道哪部分代码经常被执行,把这部分代码编译为机器码,运行起来速度也快。于是 Google 又引入了 JIT,这时候的执行模式是 AOT + JIT + 解释执行。应用安装的时候不执行 AOT 编译,安装速度飞快。初次使用应用的时候没有机器码,因此只能解释执行。

应用运行起来之后,系统收集经常被运行的代码的信息,做两件事:1)在必要的时候在运行时直接把 Java 代码编译为机器码 (JIT),然后使用机器码执行提高运行效率。2)把这个「经常被运行的代码信息保存起来」设备空闲的时候,系统拿出应用运行时候保存的「热点代码信息」直接把这些代码编译为机器码 (AOT)

Android 8.0上改进了解释器,解释模式执行效率大幅提升;Android 10.0上提供了预先放置热点代码的方式,应用在安装的时候就能知道常用代码会被提前编译。可以看到,当前 Android 平台的执行模式在空间占用+安装速度+运行速度上已经达到了一个很好的平衡。

4.方舟编译器

华为早前宣布退出自己的编译器--方舟编译器。号称能让APP的运行性能大幅度提醒。因为方舟编译器还没有公开,所以,这里可以对方舟编译器进行一些猜测。

但是在猜测前,还是找到问题的根源,和华为可能应对的解决方法:

Java因为需要跨平台,所以,不得不提供一个“虚拟机”,让程序“一次编译,到处运行。”

因为虚拟机的存在,导致安卓App总慢人一筹

这是一个矛盾的存在,那么华为既然用自己的操作系统+自己的芯片,那就学习苹果,让Java源代码直接编译为CPU可以识别的二进制。

这个和谷歌提供的AOT是不一样的,因为谷歌提供的AOT是应用程序这个级别的,而如果华为的方舟编译是让源代码直接编译为二进制的机器名,这将达到操作系统级别的性能。

如果是这样,可以说鸿蒙运行App的速度肯定会比android快很多。

相关内容推荐:

留言与评论(共有 0 条评论)
   
验证码:
Top