可以减少Javascript关联数组中的索引长度来节省内存

时间:2013-06-26 03:12:31

标签: javascript

我正在尝试在JavaScript中构建一个大型数组(22,000个元素)的关联数组元素。我是否需要担心内存使用方面的索引长度?

换句话说,以下哪个选项可以节省内存?或者它们的内存消耗是否相同?

选项1:

  var student = new Array(); 
  for (i=0; i<22000; i++)
   student[i] = {
   "studentName": token[0],
   "studentMarks": token[1],
   "studentDOB": token[2]
   };

选项2:

  var student = new Array(); 
  for (i=0; i<22000; i++)
   student[i] = {
   "n": token[0],
   "m": token[1],
   "d": token[2]
   };

我试图在Google Chrome DevTools上对此进行测试,但数字不一致,无法做出决定。我最好的猜测是因为数组索引重复,浏览器可以通过不为每个学生重复它们来优化内存使用[i],但这只是猜测。

修改 为了澄清,问题如下:包含许多小关联数组的大型数组。在内存要求方面,使用长索引还是短索引是否重要?

编辑2: 注释中提出的3N阵列方法和@Joseph Myers所指的是创建一个数组'var student = []',大小为3 * 22000,然后使用student [0]作为名称,学生[1]标记,学生[2]为DOB等。

感谢。

2 个答案:

答案 0 :(得分:3)

差异无关紧要,所以答案是。这种事情几乎不会落在 micro optimization 之下。在这样的困境中,您应该始终选择最具可读性的解决方案。从第二个选项中维护代码的成本超过了从中获得的任何(如果有的话)性能增益。

你应该做的是使用文字来创建一个数组。

[]代替new Array()。 (只是旁注)

解决问题的更好方法可能是找到一种方法来加载部分数据,实现某种分页(我假设你没有在客户端上进行繁重的计算)。

答案 1 :(得分:1)

关联数组计算成本的主要分析与性能下降有关,因为存储的元素数量增加,但随着密钥长度的增加,有一些关于性能损失的结果。

在Sedgewick的 C 算法中,值得注意的是,对于某些基于密钥的存储系统,搜索成本不会随着密钥长度而增长,而对于其他存储系统则会增长。所有基于比较的搜索方法都取决于密钥长度 - 如果两个密钥仅在最右边的位上不同,那么比较它们需要与其长度成比例的时间。基于散列的方法总是需要与密钥长度成比例的时间(为了计算散列函数)。

当然,密钥会占用原始代码中的存储空间和/或至少暂时执行脚本。

用于JavaScript的存储类型可能因不同的浏览器而异,但在资源有限的环境中,使用较小的密钥会有一个优势,例如仍然太小的优势,但是肯定会有一些情况优势是值得的。

P.S。我的图书馆刚刚收到了我在12月份订购的两本关于最新计算算法的新书,我明天可以查看它们,看看是否有关于密钥长度影响关联数组/ JS对象性能的新结果。

更新:像studentName这样的密钥在Nexus 7上的使用时间延长2%,在iPhone 5上的使用时间延长4%。这对我来说可以忽略不计。我平均500次创建一个30,000个元素的数组,每个元素包含一个对象{ a: i, b: 6, c: 'seven' },使用对象{ studentName: i, studentMarks: 6, studentDOB: 'seven' }运行500次。在台式计算机上,程序仍然运行得如此之快,以至于处理器的频率/中断次数等产生不同的结果,整个程序几乎立即完成。每运行几次,大密钥大小实际上变得更快(因为测试环境中的其他变化会影响结果超过2-4%,因为JavaScript计时器基于时钟时间而不是CPU时间。)您可以自己尝试在这里:http://dropoff.us/private/1372219707-1-test-small-objects-key-size.html

您的3N数组方法(使用数组[0],数组[1]和数组[2]获取第一个对象的内容;以及数组[3],数组[4]和数组[ 5]对于第二个对象等)比任何对象方法工作得快得多。它比小对象方法快5倍,比桌面上的大对象方法快2倍,加上2-4%,在Nexus 7上快11倍