点击上方“何俊林”,马上关注,每天早上8:50准时推送

真爱,请置顶或星标

本文作者weishu&&懒虫,非鱼哥原创,内容授权请联系原作者,内容来源知乎https://www.zhihu.com/question/319688167

华为在P30发布会上,本来是发布手机产品的,顺带提了下,即将开源的方舟编译器,大家反而对这个方舟编译器的兴趣大于了P30手机。小编今天带大家来唠嗑下方舟编译器。

安卓性能革命,提升操作系统流畅度和系统响应。到底有多流畅,看下测试视频:

方舟编译器,应该是取自诺亚方舟。华为还有一个部门叫“2012实验室”,在华为内部有着非常高的地位。海思就是2012实验室底下的二级部门之一。看得出来华为具有非常强烈的危机意识。方舟编译器的战略地位应该跟麒麟芯片差不多吧,二者可以类比一下。华为海思的麒麟芯片,从十来年前就开始开发,早期完全是赔本在做,拿钱换经验。在友商喜滋滋地用着高通和MTK芯片占据市场份额时,华为推出的早期手机芯片表现非常差,被用户和网友骂了个狗血淋头。但是华为依然在坚持着设计并使用自己的CPU(2014年推出麒麟芯片开始),哪怕差也不妥协用高通。

直到近几年,华为终于尝到了自研芯片的甜头。在友商们为了个骁龙855首发争个不停的时候,华为已经在一边自己玩去了(不止是手机CPU,其它如WIFI芯片,华为也在逐步用海思芯片替换国外公司的产品)。至此,硬件方面的诺亚方舟可以说基本建成,虽然还需要国外的桅杆、船桨等配件,但基本的船身和发动机已经替换成自己的东西,未来即使国外禁售,小破船也能继续开下去。软件方面安卓系统离不开谷歌,虽然目前安卓还是开源系统,谷歌还不对手机厂商收费。但万一收费了呢?个人估计方舟编译器就是华为在手机软件层面打造的诺亚方舟。通过提升编译效率,体现在系统流畅度上,吸引更多的安卓手机厂商来使用方舟编译器,逐渐撬松谷歌对于安卓系统的掌控力度。如果哪一天,谷歌在安卓系统上直接卡住手机厂商的脖子,那么华为就会呼吁大家去他那儿。虽然华为这船不比谷歌大,但好歹不会淹死,再集众人之力,打造一个新的开源手机生态。(来源知乎:懒虫,出处:https://www.zhihu.com/people/dqdong)

Android 平台的绝大多数应用是使用 Java 语言写的,CPU 只能理解汇编指令,无法直接识别 Java 语言的虚拟机指令;为了让 CPU 能运行 Java 语言编写的程序,一般有两种办法:

1、「计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决」 引入一个中间层,这个中间层负责 Java代码的执行,然后这个中间层本身编译为 CPU 能理解的汇编指令,也就是 CPU -> 中间层 -> Java 代码。如果这个中间层采用 Java 语言直接作为输入,理解一句 Java 语句就把Java语言翻译一下让CPU 执行一段,我们一般称这种模式为「解释执行」。毋庸置疑这种方式效率是相当低效的。

2、直接把 Java 语言翻译成 CPU 能理解的机器语言。这里又有两种方式:
在程序运行之前直接把 Java 代码编译为机器语言。这种模式我们称之为 AOT (Ahead of time)编译。

在程序运行起来之后,实时地把 Java 语言编译为机器语言然后执行。这种模式称之为 JIT(Just in time) 编译。

背景介绍完了回到 Android 平台上面,Android 平台分为几个阶段:

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

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

  • 安装速度巨慢。即使是现在吊炸天的 855 采用 AOT 模式编译一下安装包比较大的应用(如支付宝)可能就要一分钟。那个时候的 CPU 可不如现在,安装一个应用都让你等得头皮发麻。更要命的时候,系统 OTA 开机会对所有的应用执行 AOT 操作,这时候你的开机速度可能要半个小时。。。

  • 占用磁盘空间,Java 代码编译为机器码之后体积会急剧膨胀。

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

  • 应用安装的时候不执行 AOT 编译,安装速度飞快。初次使用应用的时候没有机器码,因此只能解释执行。

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

  • 设备空闲的时候,系统拿出应用运行时候保存的「热点代码信息」直接把这些代码编译为机器码 (AOT)

关于 Android 7.0 系统的演进可以参阅这里:http://s3.amazonaws.com/connect.linaro.org/las16/Presentations/Tuesday/LAS16-201%20-%20ART%20JIT%20in%20Android%20N.pdf

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

回到华为的这个方舟编译器上面,

1、现在的 Android 是边解释边执行的吗?可以说是,也可以说不是。上面我已经提到了,现在的 Android 是 解释执行 + 还算可以的JIT + AOT 的模式。并且,你也可以手动把应用的代码全部提前编译达到完全 AOT 的效果(很多答案里面提到的 AOT 就是说的这种);不过这属于开倒车,Google 肯定不会这么做。这样做效果有多大呢?这个我有发言权。之前在支付宝做性能优化的时候,我干过这么一回事:让应用在后台运行的时候请求系统直接采用 everything 模式编译支付宝,本地测试启动速度有爆炸性提升(30%~50%);但是灰度测试的时候效果不明显,为什么呢?其一是后台全编译运行成功率低,其二是系统的 JIT + 后台 AOT 不是吃素的;考虑到耗电/占空间的问题压根没上线。所以如果华为只是简单地用这种方式去避免所谓的「边解释边执行」那就相当滴 low,但是按照 GPU Turbo这种黑科技来看,我觉得不太可能是这个。

2、除了 Android 系统的这种 AOT 之外,难道没有别的办法了吗?我不负责任地猜测一下,方舟编译器是不是在Android 应用打包成APK的时候,直接把 Java 代码编译为了机器码?注意这个跟Android系统的那个 AOT 是不样的,系统是在应用安装或者系统空闲的时候做编译;这种方式你下载到的安装包就是编译好的了,不需要系统动手。(来源知乎:weisu,出处:https://www.zhihu.com/people/tian-weishu)

 推荐阅读

技术人应有的职业意识

外包员工就活该被区别对待么

好家伙,原来Java四大引用是这样的

我发现混的好的,都是挺能“吹牛逼”的

面试官问我“Java中的锁有哪些?以及区别”,我跪了

喜欢就点个在看吧!

什么?华为方舟编译器竟然这么牛逼~相关推荐

  1. 华为的Java虚拟机_华为方舟编译器解析:提升安卓运行效率

    在今年发布P30的时候,华为还发布了一个名为"方舟"的编译器,但是很多人对方舟到底是什么其实有误解,这里我们就来详细说说.可以肯定的是,方舟并不是单独操作系统!而是安卓上的工具. ...

  2. 重磅!华为方舟编译器招募 2000 程序员!

    作者 | 胡巍巍 出品 | 程序人生(ID:coder_life) 华为北京研究所的食堂,周末也好热闹! 9月7日,笔者到华为北研所,参加华为方舟编译器(以下简称"方舟")的开源主 ...

  3. 华为方舟编译器招募 2000 人!

    作者 | 胡巍巍 出品 | 程序人生(ID:coder_life) 华为北京研究所的食堂,好便宜! 9月7日,笔者到华为北研所,参加华为方舟编译器(以下简称"方舟")的开源主题沙龙 ...

  4. 【IT资讯】华为方舟编译器编译工具正式发布和工具下载

    01. 概述 2019华为全球开发者大会将在8月9日-11日在华为松山湖基地召开.本次开发者大会邀请了1500位合作伙伴.5000名全球开发者,将是华为历来规模最大的一次会议.在这次大会上,华为方舟编 ...

  5. 华为方舟编译器开源官网正式上线

    [摘要] 8月31日,华为方舟编译器开源官网正式上线. 本次方舟编译器开源的是编译器框架部分源码,包括编译器中间表示(IR)和语言编译实现,同时搭配编译器其他二进制组件,实现Java程序到aarch6 ...

  6. 华为“方舟编译器”到底是啥?一文看懂TA如何让手机性能再突破

    在华为春季发布盛典上,除了"HUAWEI P30"还有一个词也火了一把,那就是全新黑科技--"华为方舟编译器"! 先花一分钟,戳视频链接简单了解下 方舟编译器虽 ...

  7. 华为方舟编译器正式上线 已经拥有45家合作伙伴

    在前不久刚结束的华为开发者大会上,华为公布了方舟编译器的开源时间,8月31日,华为方舟编译器开源官网正式上线. 根据官网上的介绍显示,华为方舟编译器的优势主要有四个. 1.多语言联合 方舟编译器将同一 ...

  8. 支付宝App采用华为方舟编译器几乎秒开?支付宝回应:华为好棒,加油

    近日,知乎有话题称"支付宝在更新之后启动速度快了很多,有用户怀疑可能是用华为方舟编译器编译过的,所以变快了",对此,支付宝官方做出相关回应. 知乎有网友提问,如何看待「支付宝采用华 ...

  9. 华为方舟编译器正式开源,采用自主平台托管

    前不久华为开发者大会上,华为给出了鸿蒙OS及方舟编译器的开源时间表,这着实让开发者们兴奋了一把.现在华为兑现承诺,8月31日,华为方舟编译器开源官网正式上线了. 方舟开源,自主托管 根据公布的信息,本 ...

  10. 中国首个芯片大学最快于本月底在南京挂牌;​华为方舟编译器正式支持 C 语言;Ora2Pg v21.0 发布|极客头条

    整理 | 郑丽媛 头图 | CSDN 下载自东方 IC 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 国内 ...

最新文章

  1. iOS图片,视频上传视频内容旋转
  2. atomic与nonatomic,assign,copy与retain的定义和区别
  3. CSP认证201703-4 地铁修建[C++题解]:连通路径上的最大边权最小、bfs求边权为1的最短路、二分查找
  4. java 解析日期格式_日期/时间格式/解析,Java 8样式
  5. Qt笔记-解决Q3DScatter加载QCustom3DItem时Cannot open the file问题
  6. 对pca降维后的手写体数字图片数据分类_知识干货-机器学习-TSNE数据降维
  7. python列表的表示形式_将列表的字符串表示形式转换为Python中的列表
  8. Spring整合Junit框架进行单元测试Demo
  9. 在 github 上建立 pages 的过程
  10. python报告,python测试结果报告
  11. sqlalchemy query函数可用参数有哪些?
  12. Java实现HTML代码生成PDF文档
  13. TASKCTL用户权限如何设置
  14. 华为s8600手机驱动_深度丨国产OLED驱动芯片玩家的机遇与困难
  15. 怎么查看微信收藏功能的剩余可用空间
  16. html一键生成海报,微海报在线制作一键生成方法
  17. Web并发页面访问量统计实现
  18. iframe 重新加载
  19. lua -- class
  20. Python自动化办公:ppt文件操作教程

热门文章

  1. c语言 归一化图片大小,OpenCV学习笔记(1)——resize函数实现图像大小归一化
  2. 记风雨兼程的2020年,2021年,我来了!
  3. linux中screen 命令简单使用
  4. Twitter数据非API采集方法
  5. 时间格式 asp.net
  6. opencv基本绘图函数--点,线,矩形,圆等
  7. 实锤了!Chrome存在严重漏洞!
  8. NLP学习------HanLP使用实验
  9. CentOS7+rsync+sersync实现数据实时同步
  10. HTML DOM 的nodeType属性