Javascript 对象与数组性能

Javascript object versus array performance

本文关键字:性能 数组 对象 Javascript      更新时间:2023-09-26

我想保存数据并快速访问它。我的所有数据都有一个唯一的 ID。

我能想到两种可能性。

对象:

myObject[id] = myDataObject;

数组:

myArray.push(myDataObject);

如果是数组,则 ID 将在 myDataObject 中继承。如果我现在想根据ID搜索一些数据,我将如何做到这一点。最快的是什么?

根据以下情况,什么会更快:

  1. 每次新的ID 被"推送"
  2. 在数组中搜索所需数据由某种快速排序算法

对象如何处理此问题:

var someCrazyID = 1233AFE12B00ED;
console.log(myObject[someCrazyID].attribute);

它是对整个对象进行迭代,还是像我手动处理数组一样在后台进行模拟?

请首先在性能方面争论,最后我也想知道您的一般观点(维护等(

提前感谢您的帮助

在javascript中,对象基本上是哈希映射,这意味着在给定键的情况下查找某个值是一个恒定的O(1(成本操作。这使得对象非常适合基于查找的功能,因此您可能希望使用对象,因此不需要排序(当然,根据定义,对象是其键值对的未排序集合(,并且无论如何查找都会很快。

请注意,尽管在JS数组中也是对象,具有相同的查找属性,但唯一的区别是它们遵循使用后续整数作为键的约定。如果您的 ID 是整数,您还可以使用 ID 作为索引来创建一种稀疏数组,但这与创建将 ID 作为键的对象基本相同。

取决于要存储的对象数量。如果对象不多,则按对象属性访问就可以了。但是,随着数据数组数量的增加,速度会更快。

让我们测试它并执行一个实验。

重复访问对象属性和数组 100 万次并测量时间。

var obj = new Object(),
    arr = [];
// init
// let's give our object 1 million properties and to array 1 million elements
for (var i=0; i<1000000; i++) {
    obj[i] = i; //instead of obj["prop"+(i)]
    arr.push(i);
};
// let's repeat access to object property 1 million times
var d1 = (new Date()).getTime();
var x;
for (var i=0; i<1000000; i++) {
   x = obj[i]; //instead of obj["prop"+(i)]
}
var ms1 = (new Date()).getTime() - d1;
alert("Access to object property took " + ms1 + "ms.");
// now let's repeat access to array 1 million times
var d2 = (new Date()).getTime();
var y;
for (var i=0; i<1000000; i++) {
   y = arr[i];
}
var ms2 = (new Date()).getTime() - d2;
alert("Access to array took " + ms2 + "ms.");

下面是 JSFiddle:http://jsfiddle.net/0d7qu0hd/1/

我的笔记本电脑上的结果很清楚:

访问对象成员:平均 500ms

按索引访问数组:平均 3ms

编辑:正如Max指出的那样 - 转换确实需要额外的时间。如果没有转换,结果是相同的。

编辑 2:在执行了几次测试后,访问 obj[i] 似乎比数组 [i] 略快。 2 毫秒与 3-4 毫秒。