for遍历子对象的一些测试

某天某人问起我一个问题,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"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值