与JavaScript(特别是Google V8)中的数组和对象相关的性能非常有趣。我在Internet上的任何地方都找不到有关此主题的详尽文章。
我了解某些对象使用类作为其基础数据结构。如果有很多属性,有时会将其视为哈希表?
我也了解有时将数组像C ++数组一样对待(即快速随机索引,缓慢删除和调整大小)。而且,有时将它们更像对象(快速索引,快速插入/删除,更多内存)。而且,也许有时它们被存储为链接列表(例如,慢速随机索引,开始/结尾处的快速删除/插入)
JavaScript中数组/对象检索和操作的精确性能是什么? (特别是对于Google V8)
更具体地说,它对性能的影响:
任何文章或更多细节的链接也将不胜感激。:)
编辑: 我真的很想知道JavaScript数组和对象如何在后台工作。另外,V8引擎在什么 情况下 “知道”要“切换”到另一个数据结构?
例如,假设我用…创建一个数组
var arr = []; arr[10000000] = 20; arr.push(21);
这到底是怎么回事?
还是…这呢… ???
var arr = []; //Add lots of items for(var i = 0; i < 1000000; i++) arr[i] = Math.random(); //Now I use it like a queue... for(var i = 0; i < arr.length; i++) { var item = arr[i].shift(); //Do something with item... }
对于常规阵列,性能将很糟糕。相反,如果使用了LinkedList……还不错。
(我已经保存了测试用例的副本,并且在修复JSPref /找到后继者后将更新答案)
嗯。。。也许答案太过激了……但是我创建[了一个测试套件,正是为了探索这些问题(以及更多)
从这个意义上讲,您可以在此50多个测试用例测试器中看到性能问题(这将花费很长时间)。
顾名思义,它还探索了使用DOM结构的本机链接列表性质的用法。
总结如下
Array.shift()
Array.push( data );
Array[nextIndex] = data
Array.unshift(data)
array[index] = null
delete array[index]
obj[attr] = null
delete obj[attr]
Array.splice(index,0,data)
Array.splice(index,1,data)
dll.splice(index,1)
注意: 这些指标仅适用于v8不会“完全优化”的大型阵列/对象。对于小于任意大小(24?)的数组/对象大小,可能存在非常孤立的优化性能情况。更多细节可以在多个GoogleIO视频中广泛看到。
注意2: 这些出色的性能结果并未在浏览器(尤其是*cough*IE)之间共享。测试也是巨大的,因此我尚未完全分析和评估结果:请在=)中进行编辑
*cough*