我假设 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-与阵列。
请注意,在基准测试中,数组和映射是动态构建的,而不是像上面的示例那样一次性构建。
V8 开发人员在这里。V8Map以相同的方式实现所有s:它们是散列映射,并且它们计算键的散列。计算为相同的数字哈希0,1等是非常简单的,所以周围没有特别的挑战。
V8 不做任何基于只看到特定类型的键的特殊外壳。这个想法是:如果你使用 a Map,你就向引擎发出信号,表明你想要一个哈希映射实现,因为你将拥有任意键并希望它们都得到同样好的处理。另一方面,如果您知道您的密钥始终是一组密集的小数字,则可以使用 aArray代替 a Map,这对于该特定情况确实会更有效(在内存和性能方面)。给你更多的力量!
| 归档时间: |
|
| 查看次数: |
149 次 |
| 最近记录: |