当前位置: 首页 > 面试题库 >

JavaScript中对象/数组的性能如何?(特别是对于Google V8)

公孙宇
2023-03-14
问题内容

与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……还不错。


问题答案:

(我已经保存了测试用例的副本,并且在修复JSPref /找到后继者后将更新答案)

嗯。。。也许答案太过激了……但是我创建[了一个测试套件,正是为了探索这些问题(以及更多)

从这个意义上讲,您可以在此50多个测试用例测试器中看到性能问题(这将花费很长时间)。

顾名思义,它还探索了使用DOM结构的本机链接列表性质的用法。

总结如下

  • V8阵列非常快
  • 数组推入/弹出/移位比任何等效对象快约20倍以上。
  • 令人惊讶的Array.shift()是,它快于数组弹出的速度约6倍,但快于对象属性删除的速度约100倍。
  • 有趣的Array.push( data );是,速度快Array[nextIndex] = data了将近20(动态数组)到10(固定数组)倍。
  • Array.unshift(data) 比预期的要慢,并且比新添加的属性要慢大约5倍。
  • 空值array[index] = null比删除delete array[index]数组中的值(未定义)快约4倍++。
  • 令人惊讶的是,将对象中的值清空obj[attr] = null比仅删除属性要慢大约2倍delete obj[attr]
  • 毫不奇怪,中间阵列Array.splice(index,0,data)很慢,非常慢。
  • 出人意料的是,它Array.splice(index,1,data)已经过优化(没有长度变化),并且比接头快100倍Array.splice(index,0,data)
  • 毫不奇怪,divLinkedList在所有扇区上都比阵列要差,但dll.splice(index,1)移除除外(它破坏了测试系统)。
  • *所有这一切的 *最大惊喜 (如jjrv所指出的),V8阵列的写入速度比V8读取的速度稍快= O

注意:
这些指标仅适用于v8不会“完全优化”的大型阵列/对象。对于小于任意大小(24?)的数组/对象大小,可能存在非常孤立的优化性能情况。更多细节可以在多个GoogleIO视频中广泛看到。

注意2: 这些出色的性能结果并未在浏览器(尤其是*cough*IE)之间共享。测试也是巨大的,因此我尚未完全分析和评估结果:请在=)中进行编辑



 类似资料:
  • 例如,我有以下数据集: 我需要根据数组中的条件对数组进行排序。我最终得出了这样的解决方案: 但我无法理解如何使用数组而不是硬编码的和属性。数组可以有许多属性。

  • 本文向大家介绍JavaScript中的Array 对象(数组对象),包括了JavaScript中的Array 对象(数组对象)的使用技巧和注意事项,需要的朋友参考一下  1、创建Array对象方法: --->var arr = [1,2,3];//简单的定义方法 此时可以知道 此时可以知道: 2、Array对象属性 Array常见的属性有三个:constructor、length和prototyp

  • 问题内容: …每个对象还引用了同一数组中的其他对象吗? 当我第一次想到这个问题时 将存在并搜索有关如何在javascript中克隆对象的信息。我确实在StackOverflow上发现了一个问题(由相同的@JohnResig回答),他指出,使用jQuery,您可以做到 clone对象。我尝试了一下,但这只复制了数组中对象的引用。所以如果我 nodeArray [0]和clonedNodesArray

  • 问题内容: 存在一个包含许多对象的数组。通过属性在此数组中查找一个或多个对象所必需。 输入obj: 输出结果:(以值4搜索“开始”) 问题答案: _findItemByValue(Obj,“开始”,4); 与除IE6,IE7,IE8以外的所有版本兼容,但存在polyfill。

  • 有没有一种干净的方法来返回一个新对象,它省略了原始对象包含的某些属性,而不必使用像lodash这样的东西?

  • 问题内容: 我有两个阵列。我正在用PubSidebar过滤基于groupKey。 如果父母重视:日记或存款或任何价值或角色:公共,我在传递内容数组内的对象时遇到问题。我必须在基于的内容数组中传递值。 如果存在Journals and Deposits,则在内容数组内添加Journals and Deposit数据,包括公共数据。(三个对象) 如果存在Journals,则将Contents数组内的J