在 JavaScript(尤其是 Google V8)中与数组和对象相关的性能记录起来会非常有趣。我在 Internet 上找不到任何关于此主题的综合文章。
我知道有些对象使用类作为它们的底层数据结构。如果有很多属性,有时会被当作哈希表处理吗?
我还了解到数组有时被视为 C++ 数组(即快速随机索引、缓慢删除和调整大小)。而且,其他时候,它们更像是对象(快速索引、快速插入/删除、更多内存)。而且,也许有时它们被存储为链表(即缓慢的随机索引,在开始/结束时快速删除/插入)
JavaScript 中数组/对象检索和操作的精确性能如何?(专门针对 Google V8)
更具体地说,它对性能的影响是什么:
- 向对象添加属性
- 从对象中删除属性
- 索引对象中的属性
- 向数组中添加一个项目
- 从数组中删除一个项目
- 索引数组中的项目
- 调用 Array.pop()
- 调用 Array.push()
- 调用 Array.shift()
- 调用 Array.unshift()
- 调用 Array.slice()
任何有关更多详细信息的文章或链接也将不胜感激。 :)
编辑:我真的很想知道 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……还不错。
最佳答案
我创建了 a test suite, precisely to explore these issues (and more) (archived copy)。
从这个意义上说,您可以看到这个 50 多个测试用例测试器中的性能问题(这需要很长时间)。
顾名思义,它探索了使用 DOM 结构的原生链表特性的用法。
(Currently down, rebuilt in progress) More details on my blog regarding this .
总结如下
- V8 Array 很快,非常快
- 数组推送/弹出/移位比任何等效对象快约 20 倍以上。
- 令人惊讶的是
Array.shift()
速度比数组弹出慢约 6 倍,但比对象属性删除快约 100 倍。 - 有趣的是,
Array.push( data );
比Array[nextIndex] = data
快将近 20(动态数组)到 10(固定数组)倍. Array.unshift(data)
如预期的那样慢,并且比添加新属性慢约 5 倍。- 将值
array[index] = null
置空比删除它delete array[index]
(undefined) 在数组中快约 4x++。< - 令人惊讶的是,将对象中的值置为空是
obj[attr] = null
~比仅删除属性慢大约 2 倍delete obj[attr]
- 不出所料,mid array
Array.splice(index,0,data)
很慢,非常慢。 - 令人惊讶的是,
Array.splice(index,1,data)
已经过优化(长度没有变化)并且比 spliceArray.splice(index,0,data) 快 100 倍
- 不出所料,除
dll.splice(index,1)
删除(破坏测试系统的地方)外,divLinkedList 在所有扇区上都不如数组。 - 最大的惊喜 [正如 jjrv 指出的那样],V8 数组写入比 V8 读取稍快 =O
注意:这些指标仅适用于 v8 未“完全优化”的大型数组/对象。对于小于任意大小(24?)的数组/对象大小,可能存在非常孤立的优化性能案例。可以在多个谷歌 IO 视频中广泛看到更多详细信息。
注2:这些美妙的性能结果不会跨浏览器共享,尤其是
*咳咳*
IE。此外,测试量很大,因此我还没有完全分析和评估结果:请在 =) 中编辑它
更新说明(2012 年 12 月):Google 代表在 youtube 上有视频描述了 chrome 本身的内部工作原理(比如当它从链表数组切换到固定数组时,等等),以及如何优化它们。参见 GDC 2012: From Console to Chrome了解更多。
关于javascript - JavaScript 中对象/数组的性能如何? (专门针对 Google V8),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8423493/