v8 TurboFan帶來的優化
- Javascript 引擎 V8 即將采用新的引擎: TurboFan & Ignition
- TurboFan是新的編譯器
- Ignition是新的解釋器
- TurboFan帶來的好處
-
大幅度減低使用try catch帶來的性能問題
- [圖片上傳失敗...(image-1d34dc-1513587327586)]
- 對象delete操作
- delete的問題在于:
- V8 引擎為了提高屬性和對象的處理速度,在 C++ 層面基于對象的“結構”為對象創建了 C++ 類
- 這種優化是發生在運行時的,如果一個對象的“結構”是不確定的,那么 V8 就無法為其創建
hidden classes
- 只能使用另一種慢地多的方式即哈希表查找的方式來進行屬性獲取
- 當我們從對象中delete一個屬性之后,后續的屬性查找模式就會變成哈希表查找。
- 當我們從對象中delete一個屬性之后,后續的屬性查找模式就會變成哈希表查找。無法享受V8引擎為了優化對象處理速度,所創建的?
hidden classes
- 優化方案:我們通過把要移除的屬性賦值undefined來達到類似delete的效果
- delete的問題在于:
-
arguments
- arguments是一種類數組對象結構
- 之前arguments去優化的點
- 類數組對象轉換為數組
- 暴露arguments,或者說正如在
Array.prototype.slice.call(arguments)所做的一樣,arguments對象被傳送給了另一個函數
- 現在
- 類數組對象轉換為數組
- 在 Node 8.3 或者更高版本我們應該使用
spread
操作符。而在 Node 8.2 和更低版本上,我們應該使用for 循環
來把 arguments中的值復制到一個新的(已經預分配了空間的)數組中去 - 在 Node 8.3+ 版本上,把 arguments對象暴露給其它函數不再會導致性能下降
- Array.prototype.slice.call(arguments) 性能比較低
- [圖片上傳失敗...(image-e3da04-1513587327586)]
- debugger
- previous:遺留在代碼里的的debugger會降低性能
- current:所有的V8 版本上都帶來了巨大的性能下降
- [圖片上傳失敗...(image-d65101-1513587327586)]
-
遍歷
- previous:for-in速度遠遠快于其他方式
- current:,for-in的速度直線下降到了之前的四分之一,Object.keys超過了for-in
- [圖片上傳失敗...(image-8d9d11-1513587327586)]
- 創建類
- 使用對象字面值創建對象, 用一個 EcmaScript 2015 類來創建對象, 使用構造函數來創建對象速度差不多
- Node 8.2(V8 5.8)上使用類的方式明顯慢于其它方式
- 這是由于在 V8 5.8 上混合使用 Crankshaft 和 Turbofan 所致,這個問題在 Node 8.3(V86.0)中已經被解決了。
-
大幅度減低使用try catch帶來的性能問題