比较map和obj在大量插入和大量查找状态下的性能差异
代码如下:
//涉及大量的插入\\
let obj = new Object();
let map = new Map();
function insertObject() {
let preDate = new Date();
for (let i = 0; i < 1000000; i++) {
obj[`name${i}`] = i;
}
let currentDate = new Date();
return currentDate - preDate;
}
function insertMap() {
let preDate = new Date();
for (let i = 0; i < 1000000; i++) {
map.set(`name{i}`, i);
}
let currentDate = new Date();
return currentDate - preDate;
}
function searchObject() {
let preDate = new Date();
for (let i = 0; i < 1000000; i++) {
let t = obj[`name${i}`];
}
let currentDate = new Date();
return currentDate - preDate;
}
function searchMap() {
let preDate = new Date();
for (let i = 0; i < 1000000; i++) {
let t = map.get([`name${i}`]);
}
let currentDate = new Date();
return currentDate - preDate;
}
console.log(insertObject()); //970
console.log(insertMap()); //10
console.log(searchObject()); //489
console.log(searchMap()); //98
总结:在大量数据查找和插入的时候,Map数据结构都明显比object更好。
在查找命中率不同的情况下map和object的性能差异:
const map = new Map(),
obj = {};
const size = 1000000;
for (let i = 0; i < size; i++) {
map.set('key' + i, i);
obj['key' + i] = i;
}
const keys = [];
for (let i = 0; i < size; i++) {
//1. keys都找得到
//keys.push('key' + parseInt(Math.random() * size));
//2. 约一半的keys找不到
//keys.push('key' + parseInt(Math.random() * size * 2));
//3. 全部的keys都找不到
keys.push('key' + parseInt(Math.random() * size) + size);
}
const mapStartDate = new Date();
for (let i = 0; i < size; i++) {
const x = map.get(keys[i]);
}
console.log('mapUseTime:' + (new Date() - mapStartDate));
const objStartDate = new Date();
for (let i = 0; i < size; i++) {
const x = obj[keys[i]];
}
console.log('objUseTime:' + (new Date() - objStartDate));
全部命中 | 50%命中 | 全部不命中 | |
---|---|---|---|
Map | 13 | 10 | 14 |
Object | 413 | 654 | 891 |
结论:无论命中率多少,Map的性能都明显比Object好,并且命中率越低,Object的查找性能越差