JavaScript引擎V8發布v8.0版本數週後抵達Google Chrome
V8發布了8.0版本,此版本除了修復一些bug,毫無疑問又帶來了性能的提高。目前是預覽,正式版將於幾個星期後隨Chrome 80 Stable一起發布。先看看性能改進,這包括內存佔用減少與速度提升:
指針壓縮
V8 堆包含整個項目所有東西,例如浮點值、字符串字符、編譯的代碼和標記值(tagged values),標記值代表指向V8 堆的指針或小整型,開發團隊發現這些標記值佔據了堆的大部分空間。
標記值與系統指針一樣大,對於32 位架構來說,它們的寬度為32 位,而在64 位架構中,則為64 位。在將32 位版本與64 位版本進行比較時,為每個標記值使用的堆內存是原來的兩倍。
此版本通過一個方法減小了這一塊內存:指針壓縮。因為高位可以由低位合成,只需要將唯一的低位存儲到堆中即可節省內存資源,經過測試,平均節省了40% 的堆內存。
通常在減少內存的同時,也會犧牲速度性能,但是經過這一改進,V8 及其垃圾收集器中,都能夠看到真實網站性能的提升。
優化高階內置程序
此版本消除了TurboFan 優化管道中的一個限制,該限制阻止了對高階內置函數的優化。
const charCodeAt = Function.prototype.call.bind(String.prototype.charCodeAt);charCodeAt(string, 8);
charCodeAt 對 TurboFan 的調用是完全不透明的,從而導致生成對用戶定義函數的通用調用。通過此更改,現在可以識別出實際上是在調用內置 String.prototype.charCodeAt 函數,從而能夠觸發TurboFan 庫存中所有的進一步優化來改善對內置函數的調用,進而獲得與以下代碼相同的性能:
string.charCodeAt(8);
JavaScript
JavaScript 特性方面也有所變化,帶來了兩個新特性:
Optional Chaining
在編寫屬性訪問鏈時,開發者經常需要檢查中間值是否為空(null 或undefined),這樣可能會寫出很冗長的顯式錯誤檢查鏈。
// Error prone-version, could throw.const nameLength = db.user.name.length;// Less error-prone, but harder to read.let nameLength;if (db && db.user && db.user.name) nameLength = db.user.name.length;
Optional Chaining(?.)使開發者可以編寫更可靠的屬性訪問鏈,以檢查中間值是否為空。如果中間值是空值,則整個表達式的計算結果為undefined。
// Still checks for errors and is much more readable.const nameLength = db?.user?.name?.length;
同時,除了靜態屬性訪問之外,Optional Chaining 還支持動態屬性訪問和調用。
null 合併(Nullish Coalescing)
另一個與Optional Chaining 很接近的特性是null 判斷合併(Nullish Coalescing),由特定的Nullish Coalescing 操作符?? 啟用,它是一個新的短路二元運算符。
現在有時會使用邏輯|| 運算符處理默認值,例如:
functionComponent(props) { const enable = props.enabled || true; // …}
運算a || b,當a 為非真時結果為b,如果props.enabled 本身顯式設置為“false”,那麼這樣的運算還是會得到第二個運算數“true”,也就是enable = true 。
現在使用null 合併運算符??,當a 為空,也就是null 或者undefined 時,a ?? b 的運算結果為b,否則為a,這樣的默認值處理行為才是符合邏輯的,彌補了前邊講到的問題。
functionComponent(props) { const enable = props.enabled ?? true; // …}
同時,null 合併運算符和Optional Chaining 是輔助功能,可以很好地協同工作。它們可以進一步處理上述示例中沒有任何props 參數傳入的情況。
functionComponent(props) { const enable = props?.enabled ?? true; // …}
此外,API 有一些變化,可以通過以下方式查看:
git log branch-heads/7.9..branch-heads/8.0 include/v8.h
更新說明: