簡體   English   中英

如何在 v8 中檢查 object 屬性是對象內屬性、快速屬性還是慢速屬性?

[英]How do I inspect whether a object property is a in-object property, fast property, or slow property in v8?

帖子https://v8.dev/blog/fast-properties提到了三種屬性。 我如何找出一個屬性是哪一個?

我期待使用 v8 本機語法 function 或開發工具功能的答案。

(這里是 V8 開發人員。)

object 是否具有字典模式屬性是每個對象(而不是每個屬性)的決定。 替代方案 state 具有“快速”屬性,這通常意味着對象內和對象外屬性的混合。

任何使用--allow-natives-syntax運行的 V8 構建都可以使用%HasFastProperties(obj)來判斷 object 是否具有“快速”屬性(返回值為true )或字典屬性( false )。

要查看“快速”模式 object 有多少個對象內屬性,您需要調試版本,並使用%DebugPrint(obj)

據我所知,DevTools 不會公開此信息。 (恕我直言,這很好,因為除了好奇之外你不需要關心這個。)

旁注:我認為“快”和“慢”是非常具有誤導性的描述,因為它們聽起來太像“好案例”和“壞案例”,而實際上它們具有不同的優點和缺點。 使用隱藏的 class 跟蹤其精確屬性布局的對象在讀取/寫入現有屬性的值時速度很快,但在添加/刪除屬性時非常慢。 使用字典作為其屬性的對象在讀取/寫入屬性值時稍慢,但在添加/刪除屬性時要快得多。 因此,根據您的應用程序的用例,您有時需要一個,有時需要另一個,除了病態情況外,引擎也非常擅長切換到一個或另一個,並且沒有 object state 明顯優於另一個。 (如果您知道您將添加和刪除許多屬性,那么使用Map將比使用普通對象提供更好的性能。)

這是對快速和慢速屬性之間差異的長話短說。 在JS中創建一個object時,會附加一個隱藏的class。 當屬性被添加到 object 時,“類轉換”發生(舊的隱藏 class 切換到新的隱藏 class,其中包含新屬性)

當 V8 看到一個 class 構造函數 function 被聲明時,它創建一個隱藏的 class 例如:C0。 現在,當 V8 在下一行看到一個屬性被添加時,在我們的例子中:name 它用新屬性更新 C0 並從 C0 切換到一個新的隱藏 class 說 C1,然后它看到下一個屬性:age 並切換到 C2 .

在此示例中,向 2 人對象動態添加新屬性並不是優化的解決方案,因為兩個新屬性(喜歡和不喜歡)的實例化順序不同。 不同的順序會導致創建兩個不同的隱藏類,而不是共享一個公共隱藏類 class。

所以:我們為構造函數 function 人創建 C0。 它過渡到 C1 的名字,然后是 C2 的年齡。 對於 person1,當它看到一個屬性時“喜歡”並轉換到 C3a,“不喜歡”到 C4a。 但是,對於 person2,V8 首先看到屬性“不喜歡”被添加到它,因此它沒有共享隱藏的 class C3a,而是創建了一個新的隱藏的 class C3b。 然后它為 C4b 等屬性創建一個新的隱藏 class。

由於這兩個對象不共享隱藏類(當它們本可以共享它們時); 訪問 object 的屬性很慢,因為 V8 現在無法使用內聯緩存。 如果兩者共享隱藏的 class,V8 將使用內聯緩存來加快訪問速度。 所以在下面的示例中,這些是慢速屬性。 如果訂單相同,本來會很快。

希望這個對你有幫助。

 function person(name,age) { this.name = name; this.age = age; } let person1 = new person("jim", 28); let person2 = new person("jane", 27); person1.likes = "games"; person1.dislikes = "running"; person2.dislikes = "cities"; person2.likes = "nature";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM