V8 如何为 Map 实现原始值键?

Max*_*ber 0 javascript v8

我假设 V8 使用散列以便将对象用作Maps 中的键。

const a = {};
new Map([[a, "a"]]);
Run Code Online (Sandbox Code Playgroud)

问题第 1 部分:V8 如何实现具有原始值键的映射,例如以下内容?

const a = {};
new Map([[a, "a"], [1, 100], [2, 200])
Run Code Online (Sandbox Code Playgroud)

问题第 2 部分

像这样一个包含原始值键的映射怎么样,这些键都是相同的类型?

new Map([[0, 0], [1, 100], [2, 200])

我所知道的将数字映射到数字的最有效方法是使用向量,这样上面的映射就可以像这样实现:

[0, 100, 200]

V8 是否在这些方面进行了任何专业化处理?

我进行了基准测试,将 Map 与一组数字进行比较,发现 number[] 快了 37%(大致符合预期),但我不确定到底发生了什么:https : //jsperf.com/map-number-number-与阵列

请注意,在基准测试中,数组和映射是动态构建的,而不是像上面的示例那样一次性构建

jmr*_*mrk 6

V8 开发人员在这里。V8Map以相同的方式实现所有s:它们是散列映射,并且它们计算键的散列。计算为相同的数字哈希01等是非常简单的,所以周围没有特别的挑战。

V8 不做任何基于只看到特定类型的键的特殊外壳。这个想法是:如果你使用 a Map,你就向引擎发出信号,表明你想要一个哈希映射实现,因为你将拥有任意键并希望它们都得到同样好的处理。另一方面,如果您知道您的密钥始终是一组密集的小数字,则可以使用 aArray代替 a Map,这对于该特定情况确实会更有效(在内存和性能方面)。给你更多的力量!