性能

2015-05-20 40 views
1

在ECMAScript中6,I有兩個方法來定義的字典:性能

傳統方法(帶dictionary = Object.create(null)):

  • 集屬性:dictionary.key = valuedictionary[key] = value

  • 獲取屬性:dictionary.keydictionary[key]

使用地圖(與dictionary = new Map()):

  • 設置的參考:dictionary.set(key, value)

  • 得到一個參考:dictionary.get(key)

在V8中,都給予同樣的性能?

+1

你應該決定你需要,而不是對性能的語義。 – Bergi

+2

但我的問題真的是關於性能,更好的語義是什麼? – DMaster

+0

那麼,他們有*不同*的語義。除了對象被限制在字符串鍵之外,你還需要考慮原型繼承,所以'Object'實例不是最好的想法,如果有的話,你可以使用'Object.create(null)'。但通常情況下,如果字典可用,則需要使用「Map」。 – Bergi

回答

1

您可以使用JSPerf在herehere上自行測試。看起來結果會因V8版本而異。

+0

這些測試處理這樣一個小數據集。當有大約500,000個鍵/值對時,我最感興趣的是map.get性能。 –

-1

原則上Maps()意味着可變的鍵值存儲,並且可能[不保證]被實現爲散列映射。

另一方面,JavaScript引擎會嘗試根據創建對象的位置和方式來派生對象形狀(將它們視爲特定對象類型的隱式類定義),並在特定的關鍵點處給它們一個固定的佈局修復了相對於對象頭部的偏移量。這對於一組固定的小鍵來說效果很好(比hashmaps更容易緩存)。

如果javascript引擎檢測到對象不符合某些特定形狀,他們會將它更像地圖而不是它。

所以一般的指導是:如果你事先知道密鑰並且他們的數字不超過十幾個,你可以在前面設置他們的值爲null你可以使用對象。

如果您有數百鍵或動態生成的密鑰處理,然後用Map()