javascript - JavaScript 中对象/数组的性能如何? (专门针对 Google V8)

标签 javascript arrays performance object v8

在 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) 已经过优化(长度没有变化)并且比 splice Array.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/

相关文章:

javascript - 在我的例子中如何将数据从指令传递到父范围?

c# - 在 javascript 片段中使用 C# 列表

javascript - 在级联下拉列表所依赖的数组中间添加一个值

PHP 和 XML。使用 PHP 遍历 XML 文件

javascript - Vue 从方法访问数据的方式是什么?

javascript - ExtJS - 如何自动滚动到表单字段?

javascript - React'findNodeHandle 方法停止工作

c++ - 对包含整数和字符的字符串数组进行排序

performance - Oracle:同一服务器上的数据库之间的性能差异为 300 倍

java - 这两种做法在 Java 中哪一种更有效?