【検証テスト】withステートメント

by selflash forked from 【検証テスト】配列へのアクセスはデータ型を指定で高速化される? (diff: 106)
ActionScriptにwithステートメントなるものがある事を知った
withステートメントを使って大量のMovieClipのプロパティに値を代入してみた
良さがわからない、、、
使いどころ誰か教えてください
♥0 | Line 72 | Modified 2010-02-21 09:08:57 | MIT License
play

ActionScript3 source code

/**
 * Copyright selflash ( http://wonderfl.net/user/selflash )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/errZ
 */

// forked from yooKo's 【検証テスト】配列へのアクセスはデータ型を指定で高速化される?
// forked from yooKo's 【検証テスト】配列を一度空にして何度も生成する
// forked from alumican_net's Point.distance
//
// ActionScriptにwithステートメントなるものがある事を知った
// withステートメントを使って大量のMovieClipのプロパティに値を代入してみた
// 
//
// 良さがわからない、、、
// 使いどころ誰か教えてください
//
package {
    import flash.display.*;
    import flash.geom.Point;
    import flash.text.*;
    import flash.utils.*;
    
    public class Main extends Sprite {
        private var _array:Array = [];
		
	//----------------------------------*
	// Constractor
	//----------------------------------*
	public function Main():void {
            //-------- max number ------------------*
            var n:uint = 10000;
            
            for(var i:uint = 0; i < n; ++i) {
                var mc:MovieClip = new MovieClip();
                mc.hoge1 = "h";
                mc.hoge2 = "o";
                mc.hoge3 = "g";
                mc.hoge4 = "e";
                _array.push(mc);
            }
            
            _setup();
            
            
            
            //-------- Array test1 ------------------*	
            _measure("with使用", function ():void {
                var temp:Point;	
		for(var i:uint = 0; i < n; ++i) {
                    var mc:MovieClip = _array[i];
                    // ■■ ここでwithステートメント登場!! ■■
                    with( mc ){
                        x = 100;
                        y = 100;
                        alpha = 0.5;
                        hoge1 = "p";
                        hoge2 = "i";
                        hoge3 = "y";
                        hoge4 = "o";
                    }
                }
            }, 100, _array);
            
            
            
            //-------- Array test2 ------------------*
            _measure("with未使用", function ():void {
                var temp:Point;	
		for(var i:uint = 0; i < n; ++i) {
                    var mc:MovieClip = _array[i];
                    mc.x = 100;
                    mc.y = 100;
                    mc.alpha = 0.5;
                    mc.hoge1 = "p";
                    mc.hoge2 = "i";
                    mc.hoge3 = "y";
                    mc.hoge4 = "o";
                }
            }, 100, _array);
            
            
            
            //-------- Array test3 ------------------*
			
			
			
			
	    //-------- Array test4 ------------------*
	}
        
	//----------------------------------*
	// measure
	//----------------------------------*        
	private function _measure(title:String, func:Function,
numTimes:uint, array:Array, ...params):void {
	    _time = getTimer();
			
	    for (var i:int = 0; i < numTimes; i++) {
	        func.apply(null, params);
	    }
			
	    _time = getTimer() - _time;
	   
            _debug("[ " + title + " ] " + "配列の総数は" + array.length + " 個。TIMEは--> " + _time + " ms");
	}
		
	//----------------------------------*
	// debug
	//----------------------------------*		
	private function _debug(log:String):void {
	    _field.appendText(log + "\n");
	}
		
	//----------------------------------*
	// Text
	//----------------------------------*
	private var _field:TextField;
            private var _time:uint;		
	    private function _setup():void {
	    _field = new TextField();
	    _field.width = stage.stageWidth;
	    _field.height = stage.stageHeight;
			
	    var format:TextFormat = _field.defaultTextFormat;
	    format.font = "_sans";
	    _field.defaultTextFormat = format;
			
	    addChild(_field);
	}
    }
}