V8引擎團隊釋出最新版7.4,這個版本支援JIT-less模式,讓JavaScript不需要可執行記憶體也能執行,同時還改善了函式呼叫的效率,也增加記憶體使用效率。V8引擎每六個月釋出一個V8新版本,而這個最新的V8 7.4將會在幾個星期內部署到Chrome 74穩定版中。

V8 7.4現在支援在Runtime的時候,執行JavaScript不需要使用可執行的記憶體。開發團隊提到,由於在部分平臺像是iOS、智慧電視以及遊戲機臺,禁止非特權應用程式寫入存取可執行的記憶體,因此到現在為止,這些平臺都無法使用V8引擎,而V8新的JIT-less模式解決了這個問題,當使用jitless標籤啟動V8時,V8可以在沒有任何可執行記憶體分配下執行,V8引擎團隊還提到,禁止寫入可執行記憶體,能夠減少應用程式的可攻擊面。

這個新版本也從各方面改善了執行效能,包括加速參數不相符時的函式呼叫,而解析器的效能也提高了。在JavaScript中呼叫函式的時候,傳遞少或是多過宣告的形式參數是有效的語法,在V8是透過參數適應技術達成這樣的功能,但是參數適應技術卻會犧牲效能,而且會經常性的在前端以及中介框架發生。

在改進之後,現在引擎於部分情況下,能夠知道參數適應技術並非必要,也就是被呼叫的函式處在嚴格模式不使用參數,系統無法觀察實際參數的時候,而在這種情況下,V8現在會完全跳過參數適應技術,將呼叫成本降低60%。

而在Chrome中,較大的腳本是以串流的方式在Worker執行緒中,邊下載邊解析,在V8 7.4版本,原始來源串流使用了客製化UTF-8解碼,可以加速整體解碼工作,使得串流解析快了8%。另外,V8引擎團隊還在預解析器中,解決了屬性名稱重複的臭蟲,可以讓串流解析器效能提高10.5%,同時也能改進非串流解析腳本的時間。

除此之外,新版V8引擎還改進了記憶體使用效率,開發團隊提到,JavaScript原始碼編譯的位元組碼很占空間,約占據V8堆(Heap)空間15%,但是其中有許多函示只在初始化期間才會用到,或是編譯後被使用的機率很低。為了減少V8記憶體使用,這些函式的位元組碼會被標上年齡,並在執行的時候將年齡重置為零,因此當函式年齡超過閾值,在垃圾收集器執行時該位元組碼就可能被清除。

使用了這個新的位元組碼回收演算法後,V8堆記憶體使用量明顯下降5到15%,而且也不會降低效能,或是明顯增加編譯JavaScript程式碼所花費的CPU時間。


Advertisement

更多 iThome相關內容