In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

Vector型の二次元配列はArray型の二次元配列よりも遅い? 1

Get Adobe Flash player
by necoEngine 18 Apr 2011

    Talk

    Hasufel at 17 Apr 2011 23:54
    try casting your vector calls: vecD[i>>0] or vecC[i>>0][j>>0] Also try ++i instead of i++ in your loops. Finally try array[array.length>>0] = value instead of array.push(value);
    Embed
/**
 * Copyright necoEngine ( http://wonderfl.net/user/necoEngine )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/5uYH
 */

package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.text.TextFormat;
    import flash.utils.getTimer;
    
    
    public class FlashTest extends Sprite {
        public function FlashTest() {
            /**
             * 計測の仕方が変なのかな。。。
             * Vector配列の二次元配列の処理はArray型のそれより遅くなってしまう。
             * Array型に至っては二次元配列の方が速い。
             * 要素に格納するデータ型によっても違うのかな。
             **/
            
            var n0:uint;
            var n1:uint = 2500;
            var n2:uint = 4000; 
            var i:uint, j:uint;
            var arrayA:Array = new Array();
            var arrayB:Array = new Array();
            var vecA:Vector.<Vector.<uint>> = new Vector.<Vector.<uint>>();
            var vecB:Vector.<uint> = new Vector.<uint>();
            var vecC:Vector.<Vector.<uint>>;
            var vecD:Vector.<uint>;
            var a:uint = 0, b:uint = 0, c:uint, d:uint;
            var startTime:uint;
            var lap:uint;
            
            var myText:TextField = new TextField();
            addChild(myText);
            myText.width  = 600;
            myText.height = 300;
            
            // Array A
            startTime = getTimer();
            for (i = 0; i < n1; i++) {
                arrayA.push(new Array());
                for (j = 0; j < n2; j++) {
                    n0 = i * n2 + j;
                    arrayA[i].push(n0);
                }
            }
            for (i = 0; i < n1; i++) {
            for (j = 0; j < n2; j++) {
                a += arrayA[i][j];
            }
            }
            lap = getTimer() - startTime;
            myText.text = "Array 二次元: " + lap.toString();
            
            // Array B
            n0 = n1 * n2;
            startTime = getTimer();
            for (i = 0; i < n0; i++) arrayB.push(i);
            for (i = 0; i < n0; i++) b += arrayB[i];
            lap = getTimer() - startTime;
            myText.text = myText.text + "\nArray 一次元: " + lap.toString();
            
            // Vector A
            startTime = getTimer();
            for (i = 0; i < n1; i++) {
                vecA.push(new Vector.<uint>());
                for (j = 0; j < n2; j++) {
                    n0 = i * n2 + j;
                    vecA[i].push(n0);
                }
            }
            for (i = 0; i < n1; i++) {
                for (j = 0; j < n2; j++) {
                    c += vecA[i][j];
                }
            }
            lap = getTimer() - startTime;
            myText.text = myText.text + "\nVector 二次元: " + lap.toString();
            
            // Vector B
            n0 = n1 * n2;
            startTime = getTimer();
            for (i = 0; i < n0; i++) vecB.push(i);
            for (i = 0; i < n0; i++) d += vecB[i];
            lap = getTimer() - startTime;
            myText.text = myText.text + "\nVector 一次元: " + lap.toString();
            
            // Vector C Fixed
            vecC = new Vector.<Vector.<uint>>(n1, true);
            c = 0;
            startTime = getTimer();
            for (i = 0; i < n1; i++) {
                vecC[i] = new Vector.<uint>(n2, true);
                for (j = 0; j < n2; j++) {
                    n0 = i * n2 + j;
                    vecC[i][j] = n0;
                }
            }
            for (i = 0; i < n1; i++) {
            for (j = 0; j < n2; j++) {
                c += vecC[i][j];
            }
            }
            lap = getTimer() - startTime;
            myText.text = myText.text + "\nVector 二次元 配列長固定: " + lap.toString();
            
            // Vector D Fixed
            n0 = n1 * n2;
            vecD = new Vector.<uint>(n0, true);
            d = 0;
            startTime = getTimer();
            for (i = 0; i < n0; i++) vecD[i] = i;
            for (i = 0; i < n0; i++) d += vecD[i];
            lap = getTimer() - startTime;
            myText.text = myText.text + "\nVector 一次元 配列長固定: " + lap.toString();
        }
    }
}