Nodesource資深工程師Thorsten Lorenz在自家部落格發文提到,新的V8引擎做了很大個更新,特別是在編譯器架構開發團隊做出了重大的改變,從Crankshaft換成了TurboFan,以突破V8引擎陷入難以擴展的窘境,這個新的V8引擎架構帶來較小的性能懸崖(Performance Cliffs)、較快的啟動速度以及減少使用記憶體容量。現在Node.js 8也使用這個全新的V8引擎。

V8引擎在之前遇到了最佳化殺手,似乎無法直接在引擎中修復,而V8團隊也很難在維持良好的效能下,實作JavaScript新語言功能,開發陷入了瓶頸。Thorsten Lorenz談到,之所以會遇到這個困境,最主要是因為V8的架構,變得越來越難以改變和擴展,其使用的最佳化編譯器Crankshaft,缺乏持續發展語言實作的願景,而且編譯器工作管道各層沒有明顯分離逐漸成為問題,在部分極端的案例中,開發人員必須為支援4種架構,手寫組合語言程式碼。

但因為JavaScript本身是一個進化快速的語言,會不停地新增新的語言功能,因此做為先進的JavaScript引擎,V8團隊認為現況並非一個能持續發展的系統,於是開始著手設計新的編譯器架構,這個新架構具備了清楚分層設計,分為前端、最佳化層和後端。

前端主要任務是由Ignition直譯器產生位元組碼,而最佳化層則是以TurboFan取代了Crankshaft最佳化編譯器,提升了程式碼執行的效能。後端則是
以執行低階的任務為主,像是機器層級的最佳化、排程或是產生支援架構的機器碼。Thorsten Lorenz提到,光把後端分離的動作,即便現在支援9種架構,就能讓特定架構的程式碼少了29%。

而過去V8團隊由於過於專注最佳化程式碼的效能,忽略了位元組碼的執行效能,這樣不平衡的發展造成了效能懸崖(Performance Cliffs)的現象,使得整體應用程式在執行時,效能表現變得難以預測。在特定情況下,應用程式效能可能會被Crankshaft絆住,甚至在部分情況下應用程式的執行速度還可能慢上100倍。Thorsten Lorenz表示,雖然在多數的時候,最佳化編譯器並不如直譯器那樣的重要,畢竟程式碼需要被快速執行,沒有時間來預熱程式碼,而且推測性的最佳化成本並不低,在某些情況還會降低效能。

因此現在V8團隊的解決辦法,就是提高位元組碼直譯器的基準效能,透過傳遞位元組碼到內嵌最佳化階段,進而產生高度最佳化與小型直譯碼,該直譯碼可以執行指令並以低成本的方式與其他V8虛擬機器互動。也由於位元組碼很小,記憶體使用量也跟著減少,而且執行的速度也非常快速。Thorsten Lorenz表示,執行位元組碼而非TurboFan最佳化程式碼,並不會產生任何的副作用,因為位元組碼更接近最佳化程式碼,這也代表效能懸崖獲得有效的解決。

V8引擎在垃圾回收器也做了很大的變動,其中一個垃圾收集器Orinoco,現在能平行回收記憶體。V8團隊在效能改進下足功夫,還在資料型態、語言功能、記憶體分析器與程式碼快取都做了不少更新,進而增加整體應用程式運作的效能。

熱門新聞

Advertisement