谷歌的V8 JavaScript引擎的最新版本V8 8.0使用指針壓縮來減少40%的堆大小,并且不會影響性能。此外,它還使用?添加了對可選鏈接的支持。操作符和為零合并使用??。V8 v8.0將在Chrome 80版本中正式發布。
V8 v8.0適用壓縮JavaScript標記值,用來表示指針到堆或小整數,V8的核心團隊成員Leszek?wirski曾解釋道。V8將只使用較低的位,并合成較高的位,而不是使用完整的64位來表示64位CPU上的指針。V8團隊已經完整地記錄了他們的指針壓縮方法,該方法利用了與其他平臺(包括Java)使用的相同的技術。與InfoQ談話,?wirski澄清V8內存壓縮V8 v8.0作品bychopping高級32位內存地址。這強制“壓縮”指針跨越4GB空間,所有“壓縮”指針都用作其中的相對偏移量。通過將基偏移量添加回壓縮指針來計算完整指針。他還補充說,該團隊計劃將單詞對齊和地址級位轉換結合起來,以擴展壓縮堆大小,使其超過4GB的限制。一般的想法是你將你的記憶組織成單詞而不是字節。如果使用8字節的單詞,則只需要表示從0、7、15、23等位置開始的地址,從而給出跨越2 < sup > 3 < /sup > * 2 < sup > 32 < /sup >的地址字節。
值得注意的是,V8團隊表示,指針壓縮并不會造成性能損失。這與這樣一個事實有關:從一個壓縮指針到一個完整指針本身就是一個相當快的操作。在V8的情況下還有一個額外的好處,那就是垃圾收集器也變得更快了。根據初步的基準測試,這使得V8 v8.0在實際的web站點(比如Facebook、CNN和谷歌Maps)上的運行速度更快,無論在移動設備還是桌面設備上。
在JavaScript方面,V8 v8.0引入了對兩個有用的語法約定的支持:可選的鏈接和空合并。
可選鏈接的目的是使按順序訪問屬性更容易,而不會因為中間對象為null或未定義而導致出現異常的風險。例如,為了防止這種錯誤發生的可能性,在下面的代碼中,我們提前檢查我們要訪問的所有中間屬性是否定義良好:
可以通過以下代碼替換它,其中我們使用了可選的鏈接操作符?為了確保一旦中間組件為空或未定義,整個表達式將短路為未定義:
零聚并算子,??是在以下情況下的細化:
在這種上下文中,的缺點是,在上面的示例設置中,不能在需要設置的值時使用它。迭代,計算為假,例如,當設置。迭代= = 0。在這種情況下,您仍然會使用默認值,例如4。相反,空合并操作符??會正確處理這些個案,即:
換句話說,a ??b僅在a為空或未定義時計算為b,否則計算為a。
V8 v8.0還不是正式的V8穩定版本,將在幾周后在Chrome 80穩定版中發布。同時,可以使用git checkout -b 8.0 -t branch-heads/8.0訪問它。