一、什么是方舟編譯器
方舟編譯器雖然是在 4.11 日 HUAWEI P30 系列國內(nèi)發(fā)布會上公布的應(yīng)用編譯技術(shù),,但其實(shí)華為早在 5 年前就開始布局,,并投入數(shù)百專家團(tuán)隊(duì),歷經(jīng)多次嘗試,才在 EMUI 9.1 上實(shí)現(xiàn)了機(jī)器代碼的翻譯,。幾千年來,人們從裹腹耐寒到智慧創(chuàng)新,,從未停止探索世界的步伐,。同時,他們將這些智慧賦予更多的物體,,比如機(jī)器,。
想讓機(jī)器讀懂人類情感,他們之間就需要有個“翻譯”,,來充當(dāng)人機(jī)交互的橋梁,,也就是專業(yè)人士口中的編譯技術(shù)。
它能夠?qū)?C,、Java 等高級語言轉(zhuǎn)換為機(jī)器能讀懂的低級語言,,將精妙的代碼轉(zhuǎn)化為 0 和 1 的二進(jìn)制指令,消除了溝通障礙,,從而馴服了機(jī)器,。
可以說編譯器是軟件與芯片之間的橋梁,其性能,,效率直接影響到機(jī)器的運(yùn)行效率,。
二、方舟編譯器和Java的故事
而既有的安卓系統(tǒng)框架與應(yīng)用之間,,仍然使用的是不被機(jī)器直接讀懂的 Java 語義,,最初的解決方案是通過增加一個虛擬機(jī)制(JVM),相當(dāng)于一個“中間層”將 Java 語言“翻譯”為機(jī)器可以讀懂的匯編指令,。
中間層”翻譯一句 Java 語義機(jī)器就執(zhí)行一段,,也就是“邊解釋邊運(yùn)行”(動態(tài)編譯),不但效率低,,耗費(fèi)系統(tǒng)資源,,對操作流暢度也有影響。
盡管安卓系統(tǒng) 6.0 以后采用了 ART (Android Runtime)模式,,對調(diào)用次數(shù)多的 Java 代碼編譯為機(jī)器碼(靜態(tài)編譯),;在設(shè)備空閑的時候進(jìn)行一些預(yù)編譯,解決了部分 Java 代碼執(zhí)行效率問題,,但對于動態(tài)語義部分還是無法實(shí)現(xiàn)靜態(tài)編譯,,仍需要虛擬機(jī)充當(dāng)“翻譯”邊解釋邊運(yùn)行,效率和體驗(yàn)提升有限,。
而方舟編譯器,,采用了全新的系統(tǒng)及應(yīng)用的編譯和運(yùn)行機(jī)制,,對所有的 Java 語義全部做到靜態(tài)編譯,直接將 Java 語言“翻譯”成機(jī)器語言(靜態(tài)編譯),,消除了虛擬機(jī)動態(tài)編譯的額外開銷,,實(shí)現(xiàn)了開發(fā)和運(yùn)行效率的兼容并舉。
如果把編譯器看做一個翻譯,,就好比我們?nèi)サ揭粋€語言不通的國家,,原本只能通過同聲翻譯(虛擬機(jī))來進(jìn)行交流溝通,難免效率低下,。而華為方舟編譯器更像是讓您直接獲得了語言能力,,從而可以擺脫同聲翻譯(虛擬機(jī)),可以更暢快地與當(dāng)?shù)厝藴贤ā?/p>
根據(jù)華為實(shí)驗(yàn)室的測試數(shù)據(jù),,EMUI 9.1 在僅僅對系統(tǒng)組件 System Server 應(yīng)用了華為方舟編譯器后,,系統(tǒng)操作流暢度提升 24%,系統(tǒng)響應(yīng)性能提升 44%,。同時,,新浪微博極速版在應(yīng)用方舟編譯器之后,操作流暢度最高提升了60%
方舟編譯器編譯的應(yīng)用在開發(fā)階段就已完成,。也就是說,,只要是經(jīng)過編譯器編譯的應(yīng)用,在應(yīng)用市場上上架了以后,,用戶下載的就是編譯過的了,。
三、方舟編譯器在底層重造安卓系統(tǒng)體驗(yàn)
據(jù)王成錄透露,,在方舟編譯器發(fā)布當(dāng)天,,電話被打爆了,業(yè)界的開發(fā)者都高度關(guān)注,。
為什么會這樣,?因?yàn)榉街劬幾g器是對安卓底層機(jī)制的重構(gòu),給用戶體驗(yàn)帶來的提升是顛覆性的,。
它解決的是安卓手機(jī)上最大的痛點(diǎn):“卡頓”,。編譯器,就像是人類和機(jī)器溝通的橋梁,,承擔(dān)著將高級語言“翻譯”成機(jī)器能懂的機(jī)器碼,,并按照指令運(yùn)行。但是,,在安卓系統(tǒng)中,,編譯器卻有一個繞不過的坎兒:虛擬機(jī)。安卓系統(tǒng)雖然在不斷演進(jìn),,但始終需要虛擬機(jī)來實(shí)現(xiàn)解釋和執(zhí)行,。
用翻譯的方式來比喻,更容易理解,。安卓程序的虛擬機(jī)中有解釋器和編譯器,,相當(dāng)于是有兩個翻譯在運(yùn)行。解釋器好像現(xiàn)場翻譯,,演講者講一句,,就需要停下來翻譯一句給編譯器,編譯器則結(jié)合上下文一次翻譯一大段,。兩個翻譯同時在搞,,于是你聽到的內(nèi)容就是斷斷續(xù)續(xù)的,你的系統(tǒng)就會變得非??D,。
而且,虛擬機(jī)的統(tǒng)一回收內(nèi)存也是卡頓的罪魁禍?zhǔn)字?,Java的虛擬機(jī)模式提供了內(nèi)存GC(垃圾回收)機(jī)制,,內(nèi)存垃圾是集中回收,但全局回收時需要短暫中斷應(yīng)用,,成為隨機(jī)卡頓的根因之一,。
那么,方舟編譯器帶來的顛覆在哪里呢,?首先,,方舟的內(nèi)存回收機(jī)制是隨用隨回收,回收時無需暫停應(yīng)用,,因內(nèi)存回收的隨機(jī)卡頓就消除了,。其次,方舟編譯器是在應(yīng)用打包的時候直接編譯出了機(jī)器指令,,無需繁瑣的虛擬機(jī)運(yùn)行,,徹底消除了虛擬機(jī)的動態(tài)編譯的額外開銷,從邊翻譯邊執(zhí)行到提前編譯機(jī)器碼直接執(zhí)行(運(yùn)行時無需再編譯),,大幅提升了效率,,讓性能得到大幅提升。
用量化的方式可以很好地看到這種性能提升的效果:有了方舟編譯器的手機(jī),,能實(shí)現(xiàn)系統(tǒng)操作流暢度提升24%,,系統(tǒng)響應(yīng)性能提升44%。
能實(shí)現(xiàn)這樣的效果,,方舟編譯器的內(nèi)存回收機(jī)制也功不可沒,。原來虛擬機(jī)的內(nèi)存回收是統(tǒng)一進(jìn)行的,全局回收時需要暫停應(yīng)用(導(dǎo)致卡頓),;而方舟編譯器則是內(nèi)存隨用隨回收,,回收時無需暫停應(yīng)用,,顯然能夠避免卡頓。
方舟編譯器看起來深奧,,但是對應(yīng)用開發(fā)者和用戶來說卻很簡單,。王成錄說,對于應(yīng)用開發(fā)者無需修改代碼,,只需要用方舟編譯器重新編譯,,就能帶來性能的提升。對于用戶來說,,只要在應(yīng)用市場下載編譯過的應(yīng)用,,就直接能享受到性能提升的好處。
重新編譯,,會帶來應(yīng)用安裝包和安裝后占用空間的增大,,以微博極速版為例,安卓9.0的apk是9.7Mb,,安裝后是37.5Mb,,而使用方舟編譯器后的安裝文件apk是23Mb,安裝完后大約不到50Mb,。但是,,使用方舟編譯器后的性能提升卻是顛覆性的,微博極速版的操作流暢度提升了60%,!
一句話,,方舟編譯器給安卓程序的性能提升結(jié)果非常顯著。這個性能提升可以用應(yīng)用執(zhí)行時間來衡量,,而應(yīng)用執(zhí)行時間=應(yīng)用執(zhí)行指令總條數(shù)X平均每條指令所用CPU cycle數(shù)/ CPU頻率,,CPU頻率由手機(jī)硬件決定,方舟編譯器可以實(shí)現(xiàn)平均每條指令所用CPU cycle數(shù)更少,、應(yīng)用執(zhí)行指令總條數(shù)更少,,從而帶來更快的應(yīng)用執(zhí)行時間。
同樣用翻譯來比喻這種編譯帶來的性能提升,?!啊癢hat happens in Vegas, stays in Vegas”如果比作最初的應(yīng)用,如果不編譯,,翻譯可能是“在拉斯維加斯發(fā)生的一切,,就留在拉斯維加斯”,而方舟編譯器編譯帶來的則是“勿念過往 活在當(dāng)下”,,顯然要好得多,。
總結(jié)
所以,方舟編譯器、EROFS超級文件系統(tǒng)等顛覆性的技術(shù)創(chuàng)新,,只是華為在軟件領(lǐng)域不斷突破和努力的縮影,。華為正在憑借自己的技術(shù)實(shí)力和不斷努力,重造安卓系統(tǒng)的體驗(yàn),。
除了硬件的技術(shù)突破,,軟件也在用戶體驗(yàn)中扮演越來越重要的角色。這就是軟件的力量,,通過持續(xù)的技術(shù)進(jìn)步,,持續(xù)的生態(tài)開放,,讓消費(fèi)者感受到,,華為的產(chǎn)品體驗(yàn)在進(jìn)步,安卓系統(tǒng)的體驗(yàn)在進(jìn)步,。