某天某人问起我一个问题,for in 与for each in,那个的效率更高呢??
这一问我傻X了,还真没测试过…
注意:15秒限制
为免不公平,所以所有for都以得到对象为准
(其实这几个方法,目的性是不同的,可能以这个为准反而不公平吧,但这个只能说各有各道理了)
于是,测试代码如下:
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.utils.getTimer;
for (var i=0; i<100; i++)
{
var mc=new MovieClip();
mc.name = "item_" + i;
//mc的x,y坐标可以理解成这样范围大小是:500*400的区域,当然,在这个区域中mc是又无数个的
mc.x = Math.random() * 500;
mc.y = Math.random() * 400;
this.addChild(mc);
}
//给舞台添加事件处理函数,是给舞台,this is import ,yeah
stage.addEventListener(MouseEvent.MOUSE_UP,onMouseEvent);
function onMouseEvent(e:MouseEvent):void
{
var k:int;
var num = numChildren - 1,time:Number = 100000;
var i:int,j:String,o:Object,t:uint;
//getTimer()初始化flash player的毫秒数
t = getTimer();
for (k=0; k<time; k++)
{
for (j in this)
{
o = this[j];
}
}
trace("for in time:");
trace(getTimer()-t);
//
t = getTimer();
for (k=0; k<time; k++)
{
for each (j in this)
{
o=this[j];
}
}
trace("for each in time:");
trace(getTimer()-t);
//
t = getTimer();
for (k=0; k<time; k++)
{
for (i=num-1; i>=0; i--)
{
o = getChildAt(i);
}
}
trace("for getChildAt i-- time:");
trace(getTimer()-t);
//
t = getTimer();
for (k=0; k<time; k++)
{
for (i=0; i<num; i++)
{
o = getChildAt(i);
}
}
trace("for getChildAt i++ time:");
trace(getTimer()-t);
}
测试如果如下:
for in time: 16
for each in time: 17
for getChildAt i– time: 803
for getChildAt i++ time: 801
=========================
for in time: 17
for each in time: 16
for getChildAt i– time: 803
for getChildAt i++ time: 818
=========================
//
然后,o:Object会不会因为不同类型有一点影响呢.
把o:Object改成o:DisplayObject试了一下,测试结果如下:
for in time: 17
for each in time: 16
for getChildAt i– time: 791
for getChildAt i++ time: 830
=========================
for in time: 17
for each in time: 17
for getChildAt i– time: 765
for getChildAt i++ time: 843
=========================
for in time: 17
for each in time: 17
for getChildAt i– time: 796
for getChildAt i++ time: 829
=========================
Orz,对for in与for each in基本上没影响,
但意外地,对i++,i–有影响…
再试一下,i:Number -> i:int, 结果如下:
for in time: 17
for each in time: 17
for getChildAt i– time: 818
for getChildAt i++ time: 823
=========================
for in time: 16
for each in time: 16
for getChildAt i– time: 790
for getChildAt i++ time: 850
=========================
for in time: 17
for each in time: 18
for getChildAt i– time: 827
for getChildAt i++ time: 824
=========================
for in time: 18
for each in time: 16
for getChildAt i– time: 810
for getChildAt i++ time: 830
=========================
再试试,i:int->i:uint ,如果如下:
for in time: 17
for each in time: 16
for getChildAt i– time: 818
for getChildAt i++ time: 830
=========================
for in time: 16
for each in time: 17
for getChildAt i– time: 797
for getChildAt i++ time: 843
=========================
for in time: 16
for each in time: 17
for getChildAt i– time: 811
for getChildAt i++ time: 832
=========================
for in time: 16
for each in time: 16
for getChildAt i– time: 812
for getChildAt i++ time: 836
=========================
差别真的不是很明显…
getChildAt的方法,比for in的慢很多,会不会是因为getChildAt的问题呢.
把两地方的getChildAt注释掉试下,
结果:
for in time: 1
for each in time: 1
for getChildAt i– time: 4
for getChildAt i++ time: 10
=========================
for in time: 2
for each in time: 2
for getChildAt i– time: 3
for getChildAt i++ time: 10
=========================
for in time: 1
for each in time: 2
for getChildAt i– time: 4
for getChildAt i++ time: 10
=========================
–是要比++快…
但看来,以后在Sprite里遍历子对象,还是用for in比numChildren快…
不管最后是不是要得到对象
另外,如果对一般的数组Array进行一样的测试呢,
你发会现一些有意思的东西.
注意:15秒限制
测试代码:
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.utils.getTimer;
var a:Array = [];
for (var i=0; i<100; i++)
{
var mc=new MovieClip();
mc.name = "item_" + i;
mc.x = Math.random() * 500;
mc.y = Math.random() * 400;
this.addChild(mc);
a.push(i);
}
//
stage.addEventListener(MouseEvent.MOUSE_UP,onMouseEvent);
function onMouseEvent(e:MouseEvent):void
{
var k:int;
var num = numChildren - 1,time:Number = 100000;
var i:int,j:String,o:Object,t:uint;
t = getTimer();
for (k=0; k<time; k++)
{
for (j in a)
{
o = a[j];
}
}
trace("for in time:");
trace(getTimer()-t);
//
t = getTimer();
for (k=0; k<time; k++)
{
for each (j in a)
{
o = a[j];
}
}
trace("for each in time:");
trace(getTimer()-t);
//
t = getTimer();
for (k=0; k=time; i--)
{
o = a[i];
}
trace("for getChildAt i– time:");
trace(getTimer()-t);
//
t = getTimer();
for (k=0; k<time; k++)
{
for (i=0; i<num; i++)
{
o = a[i];
}
}
trace("for getChildAt i++ time:");
trace(getTimer()-t);
}
在原来的基础上加了几句,很懒,所以trace里的提示信息也没改…
测试结果:
for in time:
6407
for each in time:
232
for getChildAt i– time:
140
for getChildAt i++ time:
187
for in time:
6361
for each in time:
244
for getChildAt i– time:
141
for getChildAt i++ time:
190
//
在这种情况下,for in 与for each in ,速度竟然不是一个数量级的!!
OOPS:
测试的player版本.
变量 _level0.$version = "WIN 10,1,52,14"