Array的push与unshift方法性能比较分析


Posted in Javascript onMarch 05, 2011

从原理就可以知道,unshift的效率是较低的。原因是,它每添加一个元素,都要把现有元素往下移一个位置。但到底效率差异有多大呢?下面来测试一下。
测试环境的主要硬件:CPU T7100(1.8G);内存4G DDR2 667;硬盘5400转。主要软件:操作系统为Windows 7;浏览器为Firefox 3.6.9。测试代码:

var arr = [ ], s = +new Date; 
// push性能测试 
for (var i = 0; i < 50000; i++) { 
arr.push(i); 
} 
console.log(+new Date - s); 
s = +new Date; 
arr = [ ]; 
// unshift性能测试 
for (var i = 0; i < 50000; i++) { 

arr.unshift(i); 
} 
console.log(+new Date - s);

这段代码分别执行了50000次push和unshift操作,运行一次以后,得出结果:
12
1152
可见,unshift比push要慢差不多100倍!因此,平时还是要慎用unshift,特别是对大数组。那如果一定要达到unshift的效果,有没有其他方法呢?答案是肯定的。
Array有一个叫做reverse的方法,能够把一个数组反转。先把要放进数组的元素用push添加,再执行一次reverse,就达到了unshift的效果。比如:
for (var i = 0; i < 50000; i++) { 
arr.push(i); 
} 
arr.reverse();

reverse的性能又如何呢,下面再来测试:
var arr = [ ], s = +new Date; 
for (var i = 0; i < 50000; i++) { 
arr.push(i); 
} 
arr.reverse(); 
console.log(+new Date - s);

结果是:
12
可见,reverse性能极高,甚至于没有额外的消耗,可以放心使用。
Javascript 相关文章推荐
js继承的实现代码
Aug 05 Javascript
jquery slibings选取同级其他元素的实现代码
Nov 15 Javascript
js 针对html DOM元素操作等经验累积
Mar 11 Javascript
IE浏览器不支持getElementsByClassName的解决方法
Aug 27 Javascript
JavaScript事件学习小结(一)事件流
Jun 09 Javascript
JS中with的替代方法与String中的正则方法详解
Dec 23 Javascript
javascript 删除数组元素和清空数组的简单方法
Feb 24 Javascript
轻松学习Javascript闭包
Mar 01 Javascript
JavaScript使用readAsDataURL读取图像文件
May 10 Javascript
js实现图片上传预览原理分析
Jul 13 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
Feb 09 Javascript
json.stringify()与json.parse()的区别以及用处
Jan 25 Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
Mar 05 #Javascript
判断用户是否在线的代码
Mar 05 #Javascript
判断用户的在线状态 onbeforeunload事件
Mar 05 #Javascript
在多个页面使用同一个HTML片段《续》
Mar 04 #Javascript
在多个页面使用同一个HTML片段的代码
Mar 04 #Javascript
如何确保JavaScript的执行顺序 之实战篇
Mar 03 #Javascript
如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙
Mar 03 #Javascript
You might like
深入理解PHP内核(一)
2015/11/10 PHP
php 获取xml接口数据的处理方法
2018/05/31 PHP
jQuery Ajax之load()方法
2009/10/12 Javascript
jQuery学习3:操作元素属性和特性
2010/02/07 Javascript
zeroclipboard复制到剪切板的flash
2010/08/04 Javascript
js数组方法扩展实现数组统计函数
2014/04/09 Javascript
js对象继承之原型链继承实例
2015/01/10 Javascript
JavaScript实现仿网易通行证表单验证
2015/05/25 Javascript
js实现表单多按钮提交action的处理方法
2015/10/24 Javascript
Angular ui.bootstrap.pagination分页
2017/01/20 Javascript
JavaScript基础之AJAX简单的小demo
2017/01/29 Javascript
javascript防篡改对象实例详解
2017/04/10 Javascript
令按钮悬浮在(手机)页面底部的实现方法
2017/05/02 Javascript
详解Vue微信公众号开发踩坑全记录
2017/08/21 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
JavaScript的变量声明与声明提前用法实例分析
2019/11/26 Javascript
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
2020/05/28 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
[01:15:56]2018DOTA2亚洲邀请赛3月30日 小组赛A组 TNC VS Newbee
2018/03/31 DOTA
[04:15]DOTA2-DPC中国联赛1月19日Recap集锦
2021/03/11 DOTA
详解Django中的过滤器
2015/07/16 Python
python的concat等多种用法详解
2018/11/28 Python
用python打印菱形的实操方法和代码
2019/06/25 Python
Pytorch之parameters的使用
2019/12/31 Python
python爬虫实例之获取动漫截图
2020/05/31 Python
Python爬虫之Selenium多窗口切换的实现
2020/12/04 Python
伦敦最受欢迎的蛋糕店:Konditor & Cook
2019/11/01 全球购物
C语言变量的命名规则都有哪些
2013/12/27 面试题
毕业生个人求职的自我评价
2013/10/28 职场文书
教导处工作制度
2014/01/18 职场文书
精神文明单位申报材料
2014/05/02 职场文书
群众路线个人剖析材料及整改措施
2014/11/04 职场文书
教师个人工作总结范文2015
2015/10/14 职场文书
三严三实·严以用权心得体会
2016/01/12 职场文书
Python提取PDF指定内容并生成新文件
2021/06/09 Python
mysql查找连续出现n次以上的数字
2022/05/11 MySQL