Javascript 对象与数组性能
Javascript object versus array performance
我想保存数据并快速访问它。我的所有数据都有一个唯一的 ID。
我能想到两种可能性。
对象:
myObject[id] = myDataObject;
数组:
myArray.push(myDataObject);
如果是数组,则 ID 将在 myDataObject 中继承。如果我现在想根据ID搜索一些数据,我将如何做到这一点。最快的是什么?
根据以下情况,什么会更快:
- 每次新的ID 被"推送"
- 在数组中搜索所需数据由某种快速排序算法
对象如何处理此问题:
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 毫秒。
- JavaScript数组优化以提高性能
- javascript散列/数组混合性能
- 哪一个在访问数组长度方面的性能更好
- Javascript性能:如何在数组中循环并检查每个值比indexOf、search和match更快
- 捕获异常,而不是比较性能的数组值
- 在JavaScript性能方面模拟结构处理的C数组
- 面对非常糟糕的 angular.copy 用于大型数组的性能
- 在MongoDb中将数据存储为对象与数组以提高写入性能
- 诉诸数组中不存在的元素,会大大降低性能
- Javascript图像数据到多维数组性能问题
- Javascript 对象与数组性能
- 什么最适合性能:带键的数组或包含数组的键
- 使用动态生成的数据数组进行 ng 重复的性能
- 在循环中缓存数组查找是否有任何性能提升
- ClojureScript数组性能需要mod吗?或者它只是关于边界检查
- Javascript中嵌套for循环与数组函数的性能
- 处理大型数组时的JavaScript性能
- 即使使用较小的块,Javascript数组性能也会崩溃
- 使用Javascript通过ID查找元素的最佳性能.数组或对象
- 性能-数组.forEach vs .实现版本