臉書釋出了為行動裝置最佳化的JavaScript引擎Hermes,能提高應用程式的效能,以及為資源有限的裝置提供更順暢的使用體驗,目前Hermes的第一個使用案例,是用於改進React Native應用程式,臉書未來還計畫推出一系列分析工具,並在開發工具Visual Studio Code上提供整合支援。

現在的行動應用程式越來越複雜,容量也越來越龐大,開發人員在為應用程式增加功能時,常需要斟酌效能影響,而臉書為了提高自家應用程式的效能,對JavaScript程式以及平臺做了很多改進,但當他們在分析效能資料的時候,發現JavaScript引擎本身的啟動效能以及容量,便是影響應用程式執行效能的一大重要因素。

臉書提到,行動裝置相對桌電以及筆電來說,運算資源更少,才需要專為這類資源受限的裝置最佳化JavaScript效能,因此臉書重新打造了名為Hermes的JavaScript引擎。Hermes針對較低階運算資源不足的裝置進行最佳化,這些裝置通常擁有較少記憶體,較慢的快閃記憶體,以及較弱的計算能力,臉書希望透過Hermes,以改善應用程式載入到可用的時間(TTI,Time To Interact)、下載程式的大小,還有記憶體的使用率。

Hermes透過3個手段以提高上述的3項指標,分別是位元組碼預編譯(Bytecode Precompilation)、不使用JIT,以及特殊的垃圾回收策略。臉書提到,通常JavaScript引擎會載入JavaScript程式碼,並產生位元組碼,而這個步驟會延遲JavaScript程式開始執行的時間,但Hermes使用AOT編譯器跳過這一個過程,讓程式在發布的時候就先編譯好,因此也可以花更多的時間最佳化位元組碼,而位元組碼更小效率也就更高。

位元組碼預編譯可以明顯縮減,程式碼載入到可以開始執行與操作的時間,而且因為程式碼先編譯好了,文件映射的記憶體只需要讀取,對於像Android無置換(Swapping)操作的作業系統,在記憶體吃緊的情況下,該記憶體區塊頂多被移除,不至於整個程序被砍掉。臉書提到,雖然壓縮位元組碼比壓縮JavaScript程式碼稍大,但是Hermes本身的容量比較小,因此也減少了Android React Native應用程式整體的容量。

Hermes採用無JIT設計,臉書表示,雖然JIT編譯器是常用來加速執行的方法,但是JIT必須要在應用程式啟動時預熱,而這會使得TTI難以改善,甚至負面影響TTI,而且JIT會增加原生程式碼的大小和記憶體使用,這些缺點都會使臉書設定的三個指標下降。

在垃圾回收策略上,Hermes能夠最小化引擎使用的記憶體和虛擬地址(Virtual Address,VA)空間,Hermes的垃圾回收器具有幾個重要的特性,分別是以區塊的形式按需分配VA空間,而VA空間也不需要在單一記憶體範圍內,這能避免32位元裝置的限制,垃圾回收器也能夠移動物件,對記憶體碎片進行整理,並把不需要的記憶體區塊還給系統,並且以代數機制回收記憶體,而不做JavaScript堆(Heap)的掃描。

控制記憶體的使用,對於記憶體有限的裝置非常重要,臉書提到,低階裝置由於記憶體有限,在不會進行置換操作的作業系統,系統會關閉使用過多記憶體的應用程式,這樣不只會影響程式後臺功能,之後也需要花費許多時間重新啟動,而Hermes能盡可能避免這些影響應用程式效能的事件發生。

React Native是臉書應用Hermes最初的使用案例,並且已經完成大部分的工作,接下來還會建置時間和記憶體分析工具,讓開發者更容易改進應用程式,未來也希望能支援Visual Studio Code除錯器協定。而由於Hermes是針對行動應用程式進行最佳化,因此臉書沒有計畫要將Hermes與瀏覽器或是Node.js等伺服器基礎架構整合,臉書表示,目前市面上的JavaScript引擎仍然是這些環境的首選。


Advertisement

更多 iThome相關內容