javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > JS数组在内存的效率

JS数组在内存中的效率问题浅析

作者:猪痞恶霸

用js有很久了,但都没有深究过js的数组形式,下面这篇文章主要给大家介绍了关于JS数组在内存中的效率问题,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

JS数组

我们所熟知的JS数组的结构和其他语言数组结构类似,即物理内存是连续的,所以这也就导致了数组成员移动次数越少,其效率越高,一般数组会被分配到一段连续的内存中,像这样

大家可能会疑问,你为啥要给画一个边框呢,其实我们的数组在定义的时候默认了它的长度,即当我们像要在数组中添加元素的时候,就需要对它的长度做出改变。

效率比较

JS提供了几个api来让我们便捷地向数组中添加元素,比如说push,unshift

举个栗子🌰

我们下面写个栗子来清晰得比较一下两者所耗费的时间,我们的unshift耗费了0.24毫秒,push耗费了0.8毫秒,当然所耗费的时间还是根据所移动的元素数量来以指数倍提高的。

function _shift() {
    var arr = []
    console.time('_shift')
    for (let i = 0; i < 1000; i++) {
      arr.unshift(1)
    }
    console.timeEnd('_shift')
  }
  _shift()
function _push() {
    var arr = []
    console.time('_push')
    for (let i = 0; i < 1000; i++) {
      arr.push(1)
    }
    console.timeEnd('_push')
  }
  _push()

非连续内存问题

除此之外我们都知道JS数组是可以在同一数组中存储不同数据类型的数据的,所以就造成了JS的数组是否分配连续内存,是要看我们的数组成员类型的,当数组内成员为同一类,则为连续内存,当数组成员存在数组,字符串,那么就会分配非连续的内存,多个非连续内存会形成一个链表,当存储数据数量级庞大的时候,就会造成效率低下的问题。下面我们针对数组成员相同和数组成员不同进行一次耗时比较,为了凸显效果我将次数提高到了10的7次幂

  function _diff() {
    var arr = new Array(10000000)
    arr.push({ name: "cxy" })
    console.time('_diff')
    for (let i = 0; i < 10000000; i++) {
      arr[i] = i
    }
    console.timeEnd('_diff')
  }
  _diff()
  function _same() {
    var arr = new Array(10000000)
    console.time('_same')
    for (let i = 0; i < 10000000; i++) {
      arr[i] = i
    }
    console.timeEnd('_same')
  }
  _same()

最后可以清楚地比较出两者的差距,非连续内存的数组操作耗时是连续内存的数组的几倍。

总结

到此这篇关于JS数组在内存中的效率问题的文章就介绍到这了,更多相关JS数组在内存的效率内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文