Map与Object性能比较

768 阅读1分钟

比较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%命中全部不命中
Map131014
Object413654891

结论:无论命中率多少,Map的性能都明显比Object好,并且命中率越低,Object的查找性能越差