在迭代对象属性与迭代数组时,是否会影响性能?
示例,使用对象:
var x:Object = {one: 1, two: 2, three: 3};
for (var s:String in x) {
trace(x[s]);
}Vs使用数组
var a:Array = [1, 2, 3];
var len:Number = a.length;
for (var i:Number = 0; i < len; ++i) {
trace(a[i]);
}那么-哪个更快,最重要的因素是什么?
在一些JavaScript实现中,迭代对象属性的速度要慢到20倍,但我还没有找到ActionScript2的这种度量。
发布于 2009-01-27 22:32:17
我刚刚尝试了一个非常类似的测试,但只迭代了一次超过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");发布于 2009-01-27 21:11:07
好的。为什么不做一些简单的测量呢?
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可能会使用微软的实现,而AS2是由Adobe的AVM1执行的。
https://stackoverflow.com/questions/482954
复制相似问题