我正在尝试在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等。
感谢。
答案 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倍。