资讯专栏INFORMATION COLUMN

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

PascalXie / 3765人阅读

摘要:从原理就可以知道,的效率是较低的。那如果一定要达到的效果,有没有其他方法呢答案是肯定的。有一个叫做的方法,能够把一个数组反转。比如的性能又如何呢,下面再来测试结果是可见,性能极高,甚至于没有额外的消耗,可以放心使用。

从原理就可以知道,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性能极高,甚至于没有额外的消耗,可以放心使用。

当你的才华撑不起你的野心的时候、请潜下心、低下头、好好学习、

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/97280.html

相关文章

  • js对象监听实现

    摘要:数组则在对象监听之外额外在数组对象上的原型链上加一层原型对象来拦截掉等方法然后在执行预设的回调函数最后本文有什么不完善的地方或者流程图有待改进的地方敬请斧正。 前言 随着前端交互复杂度的提升,各类框架如angular,react,vue等也层出不穷,这些框架一个比较重要的技术点就是数据绑定。数据的监听有较多的实现方案,本文将粗略的描述一番,并对其中一个兼容性较好的深入分析。 实现方案简...

    iamyoung001 评论0 收藏0
  • [ JS 基础 ] Array 对象全面解析 -- 掌握基础 ( 4 )

    摘要:删除删除数组元素删除第一个元素可以看出,通过运算符删除数组元素也有一些注意的地方。数组方法也可以用于删除数组元素,后面讲解。该方法对数组的每一项运行给定的函数,返回该函数会返回的项组成的数组。 结合《javascript高级程序设计》《javascript权威指南》《javascript语言精粹》做的一篇关于Array对象的全面解析。分为两篇:基础篇和扩展应用篇。 1.概念及...

    sutaking 评论0 收藏0
  • JS-Array

    摘要:没有循环循环次四属性属性属性表示数组元素的数量,的数组元素并不是连续的,有些索引的位置可能没有元素,所以属性并不能真正表示元素的数量,其值等于数组最大索引。 一、JS没有真正的数组 像C++,Java这些编程语言中数组元素分配的内存都是连续,这有利于性能提升,但是JS的数组不是这样的。它使用对象模拟数组,即对象属性为数字,并含有length属性。所以JS数组对象的内存不是连续的,同一般...

    madthumb 评论0 收藏0
  • 一次前端笔试总结

    摘要:另外,原题还有字数限制的,只有在字数小于并且结果正确时才可以满分。插入节点操作的可以使用和方法,随便用一个都行。但是,这题有两个限制条件优雅的方式前个元素。 1.有一个长度未知的数组a,如果它的长度为0就把数字1添加到数组里面,否则按照先进先出的队列规则让第一个元素出队。 分析:这道题主要是考核了数组的队列方法和栈方法。另外,原题还有字数限制的,只有在字数小于30并且结果正确时才可以满...

    jsdt 评论0 收藏0
  • 一次前端笔试总结

    摘要:另外,原题还有字数限制的,只有在字数小于并且结果正确时才可以满分。插入节点操作的可以使用和方法,随便用一个都行。但是,这题有两个限制条件优雅的方式前个元素。 1.有一个长度未知的数组a,如果它的长度为0就把数字1添加到数组里面,否则按照先进先出的队列规则让第一个元素出队。 分析:这道题主要是考核了数组的队列方法和栈方法。另外,原题还有字数限制的,只有在字数小于30并且结果正确时才可以满...

    GitChat 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<