'華為“方舟編譯器”到底是啥?TA如何讓手機性能再突破'

"

雖然方舟編譯器還沒開放源碼,但是大家對此還挺有興趣的。最近和小夥伴討論了下方舟編譯器,並且討論了下我提出的一個猜測,關於編譯器執行代碼的一個可行方案。

ART - Android Runtime

4.4提出,與Dalvik共存,5.0替換Dalvik

7.0更改方案為AOT與JIT混合

"

雖然方舟編譯器還沒開放源碼,但是大家對此還挺有興趣的。最近和小夥伴討論了下方舟編譯器,並且討論了下我提出的一個猜測,關於編譯器執行代碼的一個可行方案。

ART - Android Runtime

4.4提出,與Dalvik共存,5.0替換Dalvik

7.0更改方案為AOT與JIT混合

華為“方舟編譯器”到底是啥?TA如何讓手機性能再突破

7.0的混合模式的意思就是第一次運行時編譯成機器碼,然後利用保存下來的機器碼,去掉無用的,再存起來,供下次使用。

顯而易見,以下便是缺點:

第一,在將字節碼編譯成機器碼也是需要時間的,就算是直接進入堆棧(內存),那也是有延遲的。儘管那幾毫秒對於人類來說可以忽略。更何況,CPU還是傻傻地,編譯好後會返回ART,等待ART的執行指示,等到執行指示,然後執行好後,依舊得經過ART堆棧,最後才能呈現於前臺。

第二,就算不在使用時利用保存下來的數據進行編譯,那麼在你不用的時候編譯,那就造成了耗電。

那,咱們說說華為的方舟編譯器。

在開發的時候直接編譯成機器碼。

儘管我們不知道他是單個編譯器直接編譯成機器碼還是先讓JDK/AAPT編譯成字節碼後,才轉換成機器碼,但是這個我們都可以忽略,因為這跟用戶並沒有什麼關係。

"

雖然方舟編譯器還沒開放源碼,但是大家對此還挺有興趣的。最近和小夥伴討論了下方舟編譯器,並且討論了下我提出的一個猜測,關於編譯器執行代碼的一個可行方案。

ART - Android Runtime

4.4提出,與Dalvik共存,5.0替換Dalvik

7.0更改方案為AOT與JIT混合

華為“方舟編譯器”到底是啥?TA如何讓手機性能再突破

7.0的混合模式的意思就是第一次運行時編譯成機器碼,然後利用保存下來的機器碼,去掉無用的,再存起來,供下次使用。

顯而易見,以下便是缺點:

第一,在將字節碼編譯成機器碼也是需要時間的,就算是直接進入堆棧(內存),那也是有延遲的。儘管那幾毫秒對於人類來說可以忽略。更何況,CPU還是傻傻地,編譯好後會返回ART,等待ART的執行指示,等到執行指示,然後執行好後,依舊得經過ART堆棧,最後才能呈現於前臺。

第二,就算不在使用時利用保存下來的數據進行編譯,那麼在你不用的時候編譯,那就造成了耗電。

那,咱們說說華為的方舟編譯器。

在開發的時候直接編譯成機器碼。

儘管我們不知道他是單個編譯器直接編譯成機器碼還是先讓JDK/AAPT編譯成字節碼後,才轉換成機器碼,但是這個我們都可以忽略,因為這跟用戶並沒有什麼關係。

華為“方舟編譯器”到底是啥?TA如何讓手機性能再突破

當然,咱們講講手機端他到底是怎麼個回事。

我們預測方舟的方案是應該是在打包的時間插入了一個架構在ART的運行時,暫時叫他方舟運行時。執行代碼由方舟運行時直接調用機器碼,交於CPU執行,在返回ART或者方舟呈現。

為什麼預測是在ART架構了一個運行時?

ART並不知道你編譯的二進制是可執行的,換句話來說,ART只看得懂字節碼,而看不懂二進制,那麼方舟就能直接調用二進制,繞過ART的編譯。除此之外,華為的想法是其他設備都能使用。由於安卓限權,包括根目錄讀寫限制等等,直接在ART架構一個運行時是最靠譜,並且最合理的。

Java本身就有native方法,那為什麼不直接使用native方法?

Java本身的native方法,最終還是會經過JVM,並且Android的圖像處理/音視頻都是魔改過了,更何況,他們全部方法都會經過native,然後才反饋於ART展示。而經過Java native前後都是需要進行編譯,這樣就造成了時間上的問題。

60%的流暢度提升是否真實?

我們猜測有可能。

正常來說,現在所有軟件,包括PC,移動設備等等,為了降低軟件的大小,編譯所使用的都是動態編譯,目的是將系統本身動態庫與軟件分開,從而降低軟件大小,並且縮短編譯時間,軟件運行的時候再調用動態庫鏈接編譯。這就造成了時間延遲。

不過,除了動態編譯,咱們還有靜態編譯。

"

雖然方舟編譯器還沒開放源碼,但是大家對此還挺有興趣的。最近和小夥伴討論了下方舟編譯器,並且討論了下我提出的一個猜測,關於編譯器執行代碼的一個可行方案。

ART - Android Runtime

4.4提出,與Dalvik共存,5.0替換Dalvik

7.0更改方案為AOT與JIT混合

華為“方舟編譯器”到底是啥?TA如何讓手機性能再突破

7.0的混合模式的意思就是第一次運行時編譯成機器碼,然後利用保存下來的機器碼,去掉無用的,再存起來,供下次使用。

顯而易見,以下便是缺點:

第一,在將字節碼編譯成機器碼也是需要時間的,就算是直接進入堆棧(內存),那也是有延遲的。儘管那幾毫秒對於人類來說可以忽略。更何況,CPU還是傻傻地,編譯好後會返回ART,等待ART的執行指示,等到執行指示,然後執行好後,依舊得經過ART堆棧,最後才能呈現於前臺。

第二,就算不在使用時利用保存下來的數據進行編譯,那麼在你不用的時候編譯,那就造成了耗電。

那,咱們說說華為的方舟編譯器。

在開發的時候直接編譯成機器碼。

儘管我們不知道他是單個編譯器直接編譯成機器碼還是先讓JDK/AAPT編譯成字節碼後,才轉換成機器碼,但是這個我們都可以忽略,因為這跟用戶並沒有什麼關係。

華為“方舟編譯器”到底是啥?TA如何讓手機性能再突破

當然,咱們講講手機端他到底是怎麼個回事。

我們預測方舟的方案是應該是在打包的時間插入了一個架構在ART的運行時,暫時叫他方舟運行時。執行代碼由方舟運行時直接調用機器碼,交於CPU執行,在返回ART或者方舟呈現。

為什麼預測是在ART架構了一個運行時?

ART並不知道你編譯的二進制是可執行的,換句話來說,ART只看得懂字節碼,而看不懂二進制,那麼方舟就能直接調用二進制,繞過ART的編譯。除此之外,華為的想法是其他設備都能使用。由於安卓限權,包括根目錄讀寫限制等等,直接在ART架構一個運行時是最靠譜,並且最合理的。

Java本身就有native方法,那為什麼不直接使用native方法?

Java本身的native方法,最終還是會經過JVM,並且Android的圖像處理/音視頻都是魔改過了,更何況,他們全部方法都會經過native,然後才反饋於ART展示。而經過Java native前後都是需要進行編譯,這樣就造成了時間上的問題。

60%的流暢度提升是否真實?

我們猜測有可能。

正常來說,現在所有軟件,包括PC,移動設備等等,為了降低軟件的大小,編譯所使用的都是動態編譯,目的是將系統本身動態庫與軟件分開,從而降低軟件大小,並且縮短編譯時間,軟件運行的時候再調用動態庫鏈接編譯。這就造成了時間延遲。

不過,除了動態編譯,咱們還有靜態編譯。

華為“方舟編譯器”到底是啥?TA如何讓手機性能再突破

靜態編譯的方法跟動態編譯相反,在編譯的時候,將所有所需要的動態庫內容,直接載入軟件內,那麼就降低了運行時鏈接動態庫的時間。

但是!60%應該只是實驗室的測試,要求的是極端測試環境,例如CPU完全沒事幹,內存空閒,沒用毒瘤在後臺跳等等極端環境下,才有機會實現。在日常使用上,我預測應該只有30~50%的提升。

並且,華為自己的設備完全可以在系統直接插入一個方舟運行環境,抑或是一定的配置,遇到有方舟編譯出來的應用,直接跑機器碼,直接無視ART/JVM,利用自己本身的運行時呈現。

這是在沒有源碼的情況下根據多設備都能運行的原則,並且使用官方的說法,而預測的可能性。

在源碼公佈的時候才能知道是否如此。

那麼,在8月9日源碼公佈的時候,我會盡快讓大家知道,方舟底層到底是怎麼運作的。

"

相關推薦

推薦中...