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

减少Javascript关联数组中的索引长度可以节省内存吗,javascript,Javascript,我正试图用JavaScript构建一个由关联数组元素组成的大型数组(22000个元素)。我是否需要担心与内存使用有关的索引长度 换句话说,以下哪个选项可以节省内存?或者它们在内存消耗方面是相同的 备选案文1: var student = new Array(); for (i=0; i<22000; i++) student[i] = { "studentName": token[0], "studentMarks": token[1], "student

我正试图用JavaScript构建一个由关联数组元素组成的大型数组(22000个元素)。我是否需要担心与内存使用有关的索引长度

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

备选案文1:

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

对于(i=0;i而言,差异是微不足道的,因此答案是。这类事情几乎不属于。在这种困境中,您应该始终选择最具可读性的解决方案。从第二个选项维护代码的成本超过任何(如果有的话)您可以从中获得性能增益

但是您应该做的是使用文本来创建数组

[]
而不是
新数组()
(只是旁注)


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

对关联数组计算成本的主要分析与存储的元素数量增加时的性能下降有关,但也有一些关于键长度增加时性能损失的结果

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

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

JavaScript所使用的存储类型可能因浏览器而异,但在资源受限的环境中,使用较小的键会有优势,比如优势仍然太小而无法注意到,但在某些情况下,这种优势肯定是值得的

顺便说一句,我的图书馆刚收到我在12月份订购的两本关于最新计算算法的新书,明天我可以查看它们,看看是否有关于键长度影响关联数组/JS对象性能的新结果

更新:Nexus 7上的
studentName
等键比iPhone 5上的长2%和4%。这对我来说可以忽略不计。我创建一个30000元素数组的平均运行次数为500次,每个元素包含一个对象
{a:I,b:6,c:'seven'}
而使用对象
的平均运行次数为500次{studentName:i,studentMarks:6,studentDOB:'seven'}
。在台式计算机上,程序运行速度仍然很快,处理器的中断频率/数量等会产生不同的结果,整个程序几乎立即完成。每运行几次,大键的速度实际上会更快(因为测试环境中的其他变化对结果的影响超过2-4%,因为JavaScript计时器基于时钟时间而不是CPU时间。)您可以在这里亲自尝试:


您的
3N
数组方法(对第一个对象的内容使用数组[0]、数组[1]和数组[2],对第二个对象使用数组[3]、数组[4]和数组[5],等等)工作速度比任何对象方法都快。它比桌面上的小对象方法快五倍,比桌面上的大对象方法快五倍,再加上2-4%,在Nexus 7上快11倍。

你为什么要用Javascript创建这么大的数组?你的代码显示你正在创建一个大数组(22000个索引)包含许多小的关联数组(只有三个键)。但是你的问题的标题似乎是问如何使一个大的关联数组更有效(即多个键)。你实际上希望执行哪种类型的优化?@Ed Heal:实际上,它比这小,但我不想得到答案“计算机功能强大,没有人再关心了”。我很想知道内存是如何处理的,特别是对于内存有限的基于移动设备的浏览器。@df77-如果你不诚实地回答这个问题,你希望得到一个诚实的答案吗?@Joseph Myers:关于混淆的说法你是对的。我的意思是优化以下内容:一个大数组(22000指数)包含许多小的关联数组。你能告诉我一些基准测试或以前做过的测试来支持你的答案吗?我根据经验猜测,桌面功能非常强大,这并不重要,但是如果它是一个内存有限的移动浏览器,或者是我正在处理的一百万条记录呢?是的,一些参考资料会很好无论哪种方式,收益都是不存在的。如果您需要在资源有限的平台上处理如此庞大的数据集,您应该研究将数据分成更小的组的方法。我考虑创建一个数组“var student=[]”,大小为3*22000,然后使用student[0]作为名称,student[1]作为分数,student[2]例如,对于DOB等。此解决方案是否会占用相同的内存量?我猜这将使用更小的内存,但会造成较差的可读性!@d777您的3n阵列想法对于大量数据来说是一个非常出色的优化。使用Nexus 7上的阵列花费几秒钟的同一测试几乎立即使用you描述(仅使用一个数组并将属性存储在三个相邻数组元素的组中)。你的回答很有道理。但如果你能提供一些基准测试或以前做过的测试,那就太好了。我主要关心的是内存需求,而不是比较。不过,了解比较问题也很好。解析较长的键可能需要较长的时间,但它们
  var student = new Array(); 
  for (i=0; i<22000; i++)
   student[i] = {
   "n": token[0],
   "m": token[1],
   "d": token[2]
   };