javascript - V8 如何为 Map 实现原始值键?
问题描述
我假设 V8 使用散列来使用对象作为Map
s 中的键。
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-与数组。
请注意,在基准测试中,数组和映射是动态构建的,而不是像上面示例中的多合一。
解决方案
V8 开发人员在这里。V8Map
以相同的方式实现所有 s:它们是散列映射,它们计算键的散列。计算 , 等数字的哈希0
非常1
简单,因此没有特别的挑战。
V8 不会基于仅查看特定类型的键来执行任何特殊情况。这个想法是:如果你使用 a Map
,你是在向引擎发出你想要一个哈希映射实现的信号,因为你将拥有任意键并希望它们都得到同样好的处理。另一方面,如果您知道您的密钥将始终是一组密集的小数字,则可以使用 aArray
而不是 a Map
,对于该特定情况,这确实会更有效(在内存和性能方面)。给你更多的力量!
推荐阅读
- python - 如何扫描子网中的活动站点?
- ios - 使用 POST 请求的 Swift Alamofire
- python - PYTHON3:返回值的缩进
- xml - 如何在经典 ASP 中禁用 DTD 处理以防止 MSSOAP.SOAPClinet30 中的 XXE 攻击
- node.js - Nodejs:在主题交换中使用rabbitmq消息
- c# - 如何从另一个应用程序关闭 WPF 系统托盘应用程序?
- android-studio - 调用接口方法 java.lang.Object[] java.util.Collection.toArray() 时出现 Java NullPointerException
- intellij-idea - 如何获取“保存操作”代码格式以忽略注释
- python - 将元素附加到python中的数组列表之一
- php - 在 Wordpress 中将 SQL Server 表打印到网站?