我剛剛在研究Google V8 Javascript引擎的性能改進,因爲我想將它集成到我自己的項目中。V8引擎如何處理添加屬性的排序?
我現在的興趣是隱藏的課程。其基本思想是V8創建隱藏類,因爲屬性被添加到對象中,以便高效查找該屬性,從而避免字典搜索。
例如,當你創建一個名爲p
新Point
對象時,它會創建一個隱藏的類C0
這是一個沒有屬性的類和類附加到對象:
聲明p.x = 0
將修改的對象添加屬性,然後創建一個新類指定C1
的x
屬性可以在特定的對象中的偏移量被發現。
在p.x
因此讓後是一個比較有效的操作。
最後,執行p.y = 0
將執行一個類似的操作,用結束了:
現在,這實際上是相當漂亮的,因爲如果你創建另一個Point
對象p2
,沒有新的隱藏類需要是創建,它只是被「分配」到C0
。類似地,按照該順序添加x
和y
屬性在無需創建新的隱藏類方面也是有效的。
但是這個方案有兩個潛在的問題。第一個涉及使用下面的代碼段會發生什麼:
Point p3 = new Point();
p3.y = 3141592653589;
p3.x = 2718281828459;
在我看來,這將創建兩個新隱藏的類,一個與y
偏移量爲零,另一個y
在抵消了零偏移和x
一。
這似乎有點空間低效的,因爲在這兩種情況下,最終類有一個x
和y
所以應該能夠分享類C2
,儘管你會需要交換x
和y
的對象的要求本身。
會是什麼使得過渡映射的影響多一點控制,如確保性能是按字母順序存儲?這樣一來,無論你增加x
然後y
,或y
然後x
,你仍然會在相同的最後一節課結束。添加屬性時
這將意味着一些額外的工作,但可以大大減少隱藏類的數量。
或者是額外的工作本身可能會導致性能下降?
第二個潛在的問題是,因爲該方案的整個目的是避免在對象上的字典查找,如何移動:
For x, see offset 0
For y, see offset 1
進級的幫助?
在我看來,你會仍然需要查找隱藏類中的屬性名稱來獲取對象內的偏移量。
還是我錯過了什麼,沒有字典搜索的類是必需的?
@Hanky,上車我修改是1968年霍頓HR,悶掉活塞以使它們輕於在每個頂部添加一個頂蓋以獲得更多壓縮。達到90英里每小時(從大約70),但引擎不久後融合。現代汽車根本就沒有樂趣,不得不插入一臺昂貴且不是非常可用的電腦來做任何事情:-) – paxdiablo
哈哈,一定覺得不錯:) –
也許你會覺得這有幫助:http:// www.google.com/patents/US8244775。關於交換x和y屬性的問題,我記得在v8可以正確處理這種小小的不一致的地方閱讀。但通常會產生不同的隱藏類。因爲幾乎總是以相同的順序添加屬性(通過相同的構造函數),所以在實現類似於你所建議的東西時沒有什麼意義。 –