在迭代对象属性与迭代数组时是否会影响性能?
示例,使用对象:
var x:Object = {one: 1, two: 2, three: 3};
for (var s:String in x) {
trace(x[s]);
}
使用数组的
var a:Array = [1, 2, 3];
var len:Number = a.length;
for (var i:Number = 0; i < len; ++i) {
trace(a[i]);
}
那么 - 哪个更快,最重要的是什么因素?
IIRC,在一些JavaScript实现中,迭代对象属性的速度要慢20倍,但我无法为ActionScript2找到这样的测量。答案 0 :(得分:1)
我刚刚尝试了一个非常相似的测试,但只迭代了200k个元素,结果相反:
Task build-arr: 2221ms
Task iter-arr: 516ms
Task build-obj: 1410ms
Task iter-obj: 953ms
我怀疑Luke的测试是由循环开销控制的,在数组的情况下似乎更大。 另外,请注意,数组首先填充的时间要长得多,所以如果你的任务是插入重的话,那么ymmv。
另外,在我的测试中,将arr.length存储在局部变量中会使性能提高约15%。
<强> 更新 强>
根据大众需求,我发布了我使用过的代码。
var iter:Number = 200000;
var time:Number = 0;
var obj:Object = {};
var arr:Array = [];
time = getTimer();
for (var i:Number = 0; i < iter; ++i) {
arr[i] = i;
}
trace("Task build-arr: " + (getTimer() - time) + "ms");
time = getTimer();
for (var i:Number = 0; i < iter; ++i) {
arr[i] = arr[i];
}
trace("Task iter-arr: " + (getTimer() - time) + "ms");
time = getTimer();
for (var i:Number = 0; i < iter; ++i) {
obj[String(i)] = i;
}
trace("Task build-obj: " + (getTimer() - time) + "ms");
time = getTimer();
for (var i:String in obj) {
obj[i] = obj[i];
}
trace("Task iter-obj: " + (getTimer() - time) + "ms");
答案 1 :(得分:0)
行。为什么不做一些简单的测量?
var time : Number;
time = getTimer();
var x:Object = {one: 1, two: 2, three: 3};
for( i = 0; i < 100000; i++ )
{
for (var s:String in x)
{
// lets not trace but do a simple assignment instead.
x[s] = x[s];
}
}
trace( getTimer() - time + "ms");
time = getTimer();
var a:Array = [1, 2, 3];
var len:Number = a.length;
for( i = 0; i < 100000; i++ )
{
for ( var j : Number = 0; j < len; j++)
{
a[j] = a[j];
}
}
trace( getTimer() - time + "ms");
在我的机器上,数组迭代有点慢。这可能是因为ActionScript 2没有“真正的”数组,只有关联数组(地图)。显然,要使用数组,编译器必须生成一些代码开销。我没有研究过这方面的具体细节,但我可以想象可能就是这种情况。
顺便说一句。执行此测试还可能表明将数组长度值放入变量并不会真正提高性能。放手吧......
更新:尽管ActionScript和JavaScript在语法上是相关的,但底层执行机制却完全不同。例如。 FireFox使用SpiderMonkey,IE可能会使用Microsoft实现,而AS2则由Adobe的AVM1执行。