首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActionScript2性能:遍历对象属性

ActionScript2性能:遍历对象属性
EN

Stack Overflow用户
提问于 2009-01-27 10:48:50
回答 2查看 3.8K关注 0票数 0

在迭代对象属性与迭代数组时,是否会影响性能?

示例,使用对象:

代码语言:javascript
复制
var x:Object = {one: 1, two: 2, three: 3};
for (var s:String in x) {
 trace(x[s]);
}

Vs使用数组

代码语言:javascript
复制
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的这种度量。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-01-27 22:32:17

我刚刚尝试了一个非常类似的测试,但只迭代了一次超过200k的元素,结果却截然相反:

代码语言:javascript
复制
Task build-arr: 2221ms
Task iter-arr: 516ms

Task build-obj: 1410ms
Task iter-obj: 953ms

我怀疑Luke的测试是由循环开销主导的,在数组的情况下似乎更大。另外,请注意,最初填充数组所用的时间要长得多,所以如果您的任务是插入繁重的,则使用ymmv。

此外,在我的测试中,将arr.length存储在局部变量中可以获得大约15%的可测量性能提升。

更新:

根据大众的需求,我发布了我使用的代码。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2009-01-27 21:11:07

好的。为什么不做一些简单的测量呢?

代码语言:javascript
复制
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执行的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/482954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档