ES6 javascript中的object与map性能简单测试

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zdhsoft/article/details/89636852

从ES6开始,语法原生支持Map和Set,我个人认为Map的性能应该比Object强。

关于Map与Object的区别,引用https://blog.csdn.net/liangchuannan/article/details/70053038 的说明:(红色字部分)

ES6中Map相对于Object对象有几个区别:

 1:Object对象有原型, 也就是说他有默认的key值在对象上面, 除非我们使用Object.create(null)创建一个没有原型的对象; 
 2:在Object对象中, 只能把String和Symbol作为key值, 但是在Map中,key值可以是任何基本类型(String, Number, Boolean, undefined, NaN….),或者对象(Map, Set, Object, Function , Symbol , null….); 
 3:通过Map中的size属性, 可以很方便地获取到Map长度, 要获取Object的长度, 你只能用别的方法了; 
  Map实例对象的key值可以为一个数组或者一个对象,或者一个函数,比较随意 ,而且Map对象实例中数据的排序是根据用户push的顺序进行排序的, 而Object实例中key,value的顺序就是有些规律了, (他们会先排数字开头的key值,然后才是字符串开头的key值);

相对来说,两者的区别应该很明显了,但是实际运行的性能,却不一样:下面是具体测试的代码,

系统:win10 1809

ide:vscode

node:10.x

代码:

let {datetimeUtils} = require('xmcommon');
const MM = 1000000;
const NN = 10000;
function initObject() {
    let o = {};
    for(let i = 0; i < MM; i++) {
        o[i] = i;
    }
    return o;
}

function initMap() {
    let m = new Map();
    for(let i = 0; i < MM; i++) {
        m.set(i, i);
    }
    return m;
}

let o = initObject();
let m = initMap();

let d1 = datetimeUtils.getNow();
for(let i = 0; i < MM; i++) {
    for(let j = 0; j < NN; j++) {
        let t = o[i];
    }
}
let d2 = datetimeUtils.getNow();
for(let i = 0; i < MM; i++) {
    for(let j = 0; j < NN; j++) {
        let t = m.get(i);
    }
}
let d3 = datetimeUtils.getNow();
let deta1 = d2 - d1;
let deta2 = d3 - d2;
console.log(`object:${deta1}, map:${deta2}`);

结果:

猜你喜欢

转载自blog.csdn.net/zdhsoft/article/details/89636852