【问题标题】:ActionScript2 performance: Iterating over object attributesActionScript2 性能:迭代对象属性
【发布时间】:2010-10-03 17:37:53
【问题描述】:

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

示例,使用对象:

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]);
}

那么 - 哪个更快,最重要的是什么因素?

IIRC,在某些 JavaScript 实现中,迭代对象属性的速度会慢 20 倍,但我无法为 ActionScript2 找到这样的测量方法。

【问题讨论】:

    标签: performance actionscript actionscript-2 iteration


    【解决方案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");
    

    【讨论】:

      【解决方案2】:

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

      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 由 Adob​​e 的 AVM1 执行。

      【讨论】:

      • 不确定为什么要进行 100000 次相同的测试?此外,正如西蒙所说的正确,初始化应该被排除在测量之外......
      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 2016-02-26
      • 1970-01-01
      • 2011-09-18
      • 2011-06-18
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多