首页 > 解决方案 > V8 如何为 Map 实现原始值键?

问题描述

我假设 V8 使用散列来使用对象作为Maps 中的键。

const a = {};
new Map([[a, "a"]]);

问题第 1 部分:V8 如何使用原始值键实现映射,例如以下?

const a = {};
new Map([[a, "a"], [1, 100], [2, 200])

问题第 2 部分

像这样的地图怎么样,它只包含原始值的键,而这些键都是相同的类型?

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

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

[0, 100, 200]

V8 是否沿着这些方向进行任何类型的专业化?

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

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

标签: javascriptv8

解决方案


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

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


推荐阅读