用 performance.now() 测 map 与对象在插入、查找、删除等操作的耗时差异,需控制键类型、排除初始化开销、多轮取平均并观察数据量增长趋势,map 在删除和清空时优势更明显。

直接用 performance.now() 做毫秒级计时,配合足够多次的操作循环,就能测出 Map 和普通对象在插入、查找、删除等操作上的实际耗时差异。关键不是看单次快慢,而是观察数据量增长时的性能变化趋势。
用标准方法测插入性能
插入操作测试要排除初始化开销,只测 set 或赋值本身:
- 对 Map:用
map.set(key, value)循环执行 N 次 - 对普通对象:用
obj[key] = value循环执行 N 次(key 类型统一为字符串,避免隐式转换干扰) - 每轮前调用
performance.now()记起点,结束后再记终点,差值即总耗时 - 建议至少测 1000、10000、100000 三级数据量,观察是否线性增长
查找示例要覆盖典型场景
查找性能容易被引擎优化干扰,需注意方式:
- Map 查找用
map.get(key),对象查找用obj[key](不用hasOwnProperty,那会额外走原型链) - 确保每次查找的 key 都真实存在,且顺序打乱(比如用
Math.random() * N | 0取索引),避免 V8 对连续访问做预测优化 - 可对比
map.has(key)和key in obj,前者通常更稳定
删除和清空操作不能忽略
这两个操作的差距往往比插入更明显:
- Map 删除用
map.delete(key),对象删除用delete obj[key] - 注意:
delete在 V8 中可能触发隐藏类重建,反复删改后性能会逐步下降;而map.delete()始终是 O(1) - 清空整表时,
map.clear()是单次操作;obj = {}虽快但创建新对象,for...in + delete则明显变慢
别忘了控制变量和多次取平均
一次测试容易受 GC、CPU 调度等干扰:
- 每组测试运行 5–10 轮,去掉最高最低值,取中间平均耗时
- 测试前加
gc?.()(仅 Node.js 环境启用 --expose-gc)或手动触发垃圾回收(如分配大数组后释放) - 键类型要一致:若测非字符串键(如对象、函数),普通对象会强制转成
[object Object],结果失真,此时只应测 Map
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











