【问题标题】:AS3 Array "for each ... in" performance vs. for loop, and guaranteed in order?AS3 数组“for each ... in”的性能与 for 循环,并按顺序保证?
【发布时间】:2013-04-02 00:00:09
【问题描述】:

这个问题真的是双重的:

  1. for each 循环遍历 Array 与简单的 for 循环遍历其元素在性能方面有何不同?

  2. 循环是否保证顺序遍历?下面的代码说是:

var sample_array:Array = [];
for (var i:uint = 0; i < 10000; i++) sample_array.push(i);
i = 0;
for each(var value:uint in sample_array) {
  sample_array[i++] = value;
}

trace('in order was:', check_in_order(sample_array));

function check_in_order(array:Array):Boolean
{
  for (var i:uint = 0, l:uint = array.length; i < l; ++i) {
    if (array[i] != i) return false;
  }

  return true;
}

但我听说其他(高级)工程师上下发誓,遍历并不总是按升序进行!这是真的吗?

【问题讨论】:

  • 也看看jacksondunstan.com/articles/1978。这是 Jackson Dunstan 比较 for、for-in 和 for-each 的一篇很棒的文章。
  • @Dovyski - 将其作为答案发布,我会接受;老兄在基准测试方面做得很好(唯一可能缺少的是包含可变大小的数组)。
  • @Joetjah - 谢谢。回覆。 “对于每个保证的顺序?” - Jon Skeet 变得好战了! AS3 对 ECMA 文档的权利,该文档既不确认也不否认顺序遍历。用 Skeet 先生的话来说——“说实话,这有点令人不满意 :(”在我运行的测试中,我从未见过每次 Array 遍历都出局或有序,因为它的价值。
  • @Sensei James 我已经发布了我的答案:) 关于你所说的,我同意:唯一缺少的是一个可变大小的数组。但是我不相信它会损害 read 操作期间的性能。

标签: actionscript-3 flash


【解决方案1】:

请查看我的帖子Flex Array Performance: For vs. ForEach

一些代码

var size:Number = 10000000;
var arr:Array = [];
for (var i:int=0; i
var time:Number, o:Object;

// for()
time = getTimer();
for (i=0; i=0; i--) { arr[i]; }
trace("for reversed test: "+(getTimer()-time)+"ms");

// for..in
time = getTimer();
for each(o in arr) { o; }
trace("for each test: "+(getTimer()-time)+"ms");

结果

for test: 124ms
for reversed test: 110ms
for each test: 261ms

【讨论】:

    【解决方案2】:

    正如Jackson Dunstan 所证明的,他将forfor eachfor in 与不同的集合(数组、向量等)进行了比较,性能排名是(从最快到最慢):

    1. for
    2. for each
    3. for in(非常慢)

    在所有情况下,for 是最快的。特别是与数组或向量一起使用时,for 具有压倒性的性能。这些是所有集合的数字(越小意味着越快):

    【讨论】:

      【解决方案3】:

      这是来自 Adrian 的固定帖子

      var size:Number = 10000000;
      var arr:Array = [];
      var time:Number, o:Object, i:int;
      // fill container
      for (i = 0; i < size; i++) arr[i] = i;
      
      time = getTimer();
      for (i=0; i<arr.length; i++){ arr[i]; }
      trace("for test: "+(getTimer()-time)+"ms");
      
      // for()
      time = getTimer();
      for (i=arr.length; i>0; i--) { arr[i]; }
      trace("for reversed test: "+(getTimer()-time)+"ms");
      
      // for..in
      time = getTimer();
      for each(o in arr) { o; }
      trace("for each test: "+(getTimer()-time)+"ms");
      
      // Result
      for test: 212ms
      for reversed test: 26ms
      for each test: 103ms
      

      【讨论】:

        猜你喜欢
        • 2011-10-31
        • 2012-11-18
        • 2012-08-06
        • 1970-01-01
        • 2015-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-12
        相关资源
        最近更新 更多