Map和Object的性能对比

插入性能

向Object和Map中插入新键/值对的消耗大致相当,当涉及到大量的插入操作时,Map的性能更佳
function initObj(){
    
    
	let obj = new Object();
	let begin = Date.now();
	for(let i=0;i<1000000;i++) {
    
    
		obj['name'+i]=i;   
        //obj[i]=i
	}
	let end = Date.now();
	return end-begin;
}

function initMap(){
    
    
	let map = new Map();
	let begin = Date.now();
	for(let i=0;i<1000000;i++) {
    
    
		map.set('name'+i,i);  
        //map.set(i,i)
	}
	let end = Date.now();
	return end-begin;
}

console.log(`object set spend ${
      
      initObj()},map set spend ${
      
      initMap()}`);
//object set spend 2179,map set spend 1638

如果键为整数值时 最终输出结果显示object的性能要好于map。

‘object set spend 88,map set spend 295’

查找速度

从大型Object和Map中查找键/值对的性能差异极小,如果只包含少量键/值对,Object有时候速度更快。在把Object当成数组使用的情况下(比如连续整数作为属性),浏览器引擎进行了优化,在内存中使用了更高效的布局。如果代码涉及大量查找操作时,某些情况下选用Object性能更好些。
function initObj(){
    
    
 let obj = new Object();
 for(let i=0;i<1000000;i++) {
    
    
 	obj[i]=i;  
 // obj['name'+i]=i;
 }
 return obj;
}


function initMap(){
    
    
 let map = new Map();
 for(let i=0;i<1000000;i++) {
    
    
 	map.set(i,i);  
 // map.set('name'+i,i);
 }
 return map;
}
let obj = initObj();
let map = initMap();
function getObjTimes(){
    
    
 let begin = Date.now();
 for(let i=0;i<1000000;i++) {
    
    
 	let t=obj[i];  
 // let t=obj['name'+i];
 }
 let end = Date.now();
 return end-begin;
}


function getMapTimes(){
    
    
 let begin = Date.now();
 for(let i=0;i<1000000;i++) {
    
    
 	let t=map.get(i);  
 // let t=map.get('name'+i);
 }
 let end = Date.now();
 return end-begin;
}

console.log(`object get spend ${
      
      getObjTimes()},map get spend ${
      
      getMapTimes()}`); 
//object get spend 5,map get spend 100

如果键不为整数时输出结果为:‘’object get spend 773,map get spend 239",可以发现Map的性能要好于Object。

删除性能

Object除了delete方法还有一些伪删除对象属性的操作,包括把属性值设置为undefined或null。对于大多数浏览器引擎来说,Map的delete()操作都比插入和查找更快,代码中涉及到大量删除操作时,应该选择Map
function initObj(){
    
    
    let obj = new Object();
	for(let i=0;i<1000000;i++) {
    
    
		//obj[i]=i;  
		obj['name'+i]=i;
	}
    return obj;
}


function initMap(){
    
    
    let map = new Map();
	for(let i=0;i<1000000;i++) {
    
    
		//map.set(i,i);  
		map.set('name'+i,i);
	}
    return map;
}
let obj = initObj();
let map = initMap();
function getObjTimes(){
    
    
	let begin = Date.now();
	for(let i=0;i<1000000;i++) {
    
    
		//delete obj[i];  
		delete obj['name'+i];
	}
	let end = Date.now();
	return end-begin;
}


function getMapTimes(){
    
    
	let begin = Date.now();
	for(let i=0;i<1000000;i++) {
    
    
		//map.delete(i);  
		map.delete('name'+i);
	}
	let end = Date.now();
	return end-begin;
}
console.log(`object delete spend ${
      
      getObjTimes()},map delete spend ${
      
      getMapTimes()}`);
// object delete spend 1621,map delete spend 913

如果键为整数输出结果为’object delete spend 184,map delete spend 318’ ,可以发现Object性能要好于Map

内存占用

存储单个键/值对所占用的内存数量都会随着键的数量线性增加。给定固定大小的内存,Map大约可以比Object多存储50%的键/值对。

猜你喜欢

转载自blog.csdn.net/weixin_43398820/article/details/118056553