详解关于JSON.parse()和JSON.stringify()的性能小测试

时间:2013.08.26 发布人:doqzn

详解关于JSON.parse()和JSON.stringify()的性能小测试

已解决问题

谷歌doqzn用户在2013.08.26提交了关于“北海公园详解关于JSON.parse()和JSON.stringify()的性能小测试”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-02-27T03:56:36。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,你就是当代的活雷锋,太感谢了 !

希望以下的回答,能够帮助你。

第1个回答

用户名:tonyma2529614  

JSON.parse(JSON.stringify(obj))我们色实波掌错断娘伯衣观飞一般用来深拷贝,其统占给两过程说白了,就是利用J来自SON.stringify将js对象序列化(JSON字符串),再使用JSON.parse来反序列化毛鱼(还原)js对象。至于这行代码为什么能实现深拷贝,以及它有什么局限性等等,不是本文要介绍的。本文要探究的是,这行代码的执行效率如何?苗音传入紧言死式设没如果随意使用会不会造成一些问题?

先上两个js性能测试的依赖函数

/***一个简单的断言函数*@paramv问答alue{Boolean}断言条件*@paramdesc{String}一个消息*/functionassert(value,desc){letli=documen合鲜t.createEl让空述月去觉政温雷着攻ement('li');li.className=value?'pass':'fail';li.appendChild(document.createTextNode(desc));document.getElementById('results').appendChild(l刚味握罪磁结含天黑i);}/***一个测试套殖果固球害击培件,定时器是为了多次执行减少误差*@paramfn{Functio超职绝n}需要多次执行的代码块(需要测试院层们积乎远分得季、比对性能的代码块)*@paramconfig{Object}配置项,maxCount:执行基态权果及求牛旧代码块的for循环次数,times:定时器执行次数*/functionintervalTest(fn,config={}){letmaxCount=config.maxCou分造唱唱nt||1000;lettimes=confi直呀茶来况越尔g.times||10团族温其边宪;lettimeA知水获充板rr=[];lettimer=setInterval(function(){letstart=newDate().getTime();for(leti=0;i<maxCo月快拉管unt;i++){***.call(this);}letelapsed=newDate().getTime()-start;观哥历案打assert(true,'Measuredtime:'+elapsed+'ms');timeArr.push(elapsed);if(timeArr.length===ti书呢旧造蒸严触逐mes){clearInterval(timer);let**erage=timeArr.re**ce((p,c)=>p+c)/times;letp=document.createElement('p');p.innerh**TML=`for循环:${maxCount}次,定时器执行:${times}次,平均值:${**erage}ms`;document.body.appendChild(p);}},1000);}

定义一些初始**

letjsonData={title:'hhhhh',dateArr:[],series:[{name:'line1',data:[]},{name:'line2',data:[]},{name:'line3',data:[]},]};letres=[{name:'line1',value:1},{name:'line2',value:2},{name:'line3',value:3},];

场景1:模拟真实环境中图表**实时更新

**处理函数

/***处理json**的函数。模拟真实环境中图表**实时更新*@paramlastData{Object}上一次的***@paramres{Array}当前***@returnsdata处理完成后的结果集*/functionhandleJsonData(lastData,res){//1.使用JSON.parse(JSON.stringify())深拷贝letdata=JSON.parse(JSON.stringify(lastData));//2.不使用JSON序列化,直接修改参数//letdata=lastData;if(data.dateArr.length>60){data.dateArr.shift();for(leti=0;i<data.series.length;i++){data.series[i].data.shift();}}data.dateArr.push(newDate().toTimeString().substr(0,8));for(leti=0;i<data.series.length;i++){data.series[i].data.push(res[i].value);}returndata;}

maxCount=100

跑起来,先让maxCount=100,for循环100次

letjsonTest=function(){jsonData=handleJsonData(jsonData,res);};intervalTest(jsonTest,{maxCount:100});

1.使用JSON.parse(JSON.stringify())深拷贝的结果:

2.不使用JSON序列化,直接修改参数的结果:

functionhandleJsonData(lastData,res){//1.使用JSON.parse(JSON.stringify())深拷贝//letdata=JSON.parse(JSON.stringify(lastData));//2.不使用JSON序列化,直接修改参数letdata=lastData;//}

maxCount=1000

intervalTest(jsonTest,{maxCount:1000});

1.使用JSON.parse(JSON.stringify())深拷贝的结果:

2.不使用JSON序列化,直接修改参数的结果:

maxCount=10000

intervalTest(jsonTest,{maxCount:10000});

1.使用JSON.parse(JSON.stringify())深拷贝的结果:

2.不使用JSON序列化,直接修改参数的结果:

场景2:判断一个对象是否为空对象

//1.使用JSON.stringify()判断一个对象是否为空对象letisEmptyObject1=function(){if(JSON.stringify(jsonData)==='{}'){//dosomething}};//2.使用Object.keys().length判断一个对象是否为空对象letisEmptyObject2=function(){if(Object.keys(jsonData).length===0){//dosomething}};

只是走了一下判断条件,if**没有执行代码

maxCount=1000

1.使用JSON.stringify()判断一个对象是否为空对象的结果:

intervalTest(isEmptyObject1,{maxCount:1000});

2.使用Object.keys().length判断一个对象是否为空对象的结果:

intervalTest(isEmptyObject2,{maxCount:1000});

maxCount=10000

1.使用JSON.stringify()判断一个对象是否为空对象的结果:

2.使用Object.keys().length判断一个对象是否为空对象的结果:

maxCount=100000

1.使用JSON.stringify()判断一个对象是否为空对象的结果:

2.使用Object.keys().length判断一个对象是否为空对象的结果:

关于JSON.parse()和JSON.stringify()的测试先到此为止,变换参数、更改执行的代码块可能会有不同结果,以上结果仅供参考。

小结论:能不用JSON.parse()和JSON.stringify()就不用,采用替代方案且性能更优的。PS:特别是需要多次执行的代码块,特别是这个JSON**比较庞大时

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解浅谈JSON.parse()和JSON.stringify()JSON.parse()和JSON.stringify()使用介绍