Vector 走査のベンチマーク

by alpicola
♥3 | Line 82 | Modified 2009-02-14 19:50:50 | MIT License
play

ActionScript3 source code

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

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    initialize="init()">
<mx:Script>
    <![CDATA[
       //forked from zahir's n乗倍の計算をMath.powとfor文とで比較してみるの事
        private const yn:String = "\n";
        private const str:String = "Vector 走査のベンチマーク" + yn + "10000 個の数の和を求める" + yn + yn;
        private var vec:Vector.<Number> = new Vector.<Number>(10000);
        private var sum:Number;
        
        private function init():void {
            for (var i:int = 0; i < 10000; i++) vec[i] = Math.random();
            txt.text = str;
        }
        private function start():void {
            var n:int = Number(loop.text);
            benchmark("for", forSum, this, n);
            benchmark("for .. in", forInSum, this, n);
            benchmark("for each .. in", forEachInSum, this, n);
            benchmark("while", whileSum, this, n);
            benchmark("forEach (anonymous func)", forEachAnonymousSum, this, n);
            benchmark("forEach (declared func)", forEachDeclaredSum, this, n);
            benchmark("forEach (method)", forEachMethodSum, this, n);
            txt.text += yn;
        }
        private function benchmark(name:String, callback:Function, thisObject:* = null, times:uint = 1):void {
            var t:uint = getTimer();
            for (var i:int = 0; i < times; i++) {
                callback.call(thisObject);
            }
            txt.text += name + ": " + (getTimer() - t) + " ms (" + callback.call(thisObject) + ")" + yn;
        }
        private function clear():void {
            txt.text = str;
        }
        private function forSum():Number {
            var re:Number = 0;
            for (var i:int = 0, length:int = vec.length; i < length; i++) { re += vec[i] }
            return re;
        }
        private function forInSum():Number {
            var re:Number = 0;
            for (var i:String in vec) { re += vec[i] }
            return re;
        }
        private function forEachInSum():Number {
            var re:Number = 0;
            for each (var n:Number in vec) { re += n }
            return re;
        }
        private function whileSum():Number {
            var re:Number = 0;
            var n:int = vec.length;
            while (n--) { re += vec[n] }
            return re;
        }
        private function forEachAnonymousSum():Number {
            var re:Number = 0;
            vec.forEach(function(n:Number, i:int, v:Vector.<Number>):void { re += n });
            return re;
        }
        private function forEachDeclaredSum():Number {
            var re:Number = 0;
            vec.forEach(add);
            return re;

            function add(n:Number, i:int, v:Vector.<Number>):void { re += n }
        }
        private function forEachMethodSum():Number {
            sum = 0;
            vec.forEach(addMethod);
            return sum;
        }
        private function addMethod(n:Number, i:int, v:Vector.<Number>):void {
            sum += n;
        }
    ]]>
</mx:Script>
    <mx:TextArea left="10" right="10" top="10" bottom="45" id="txt"/>
    <mx:Button bottom="15" label="start" click="start()"  right="73"/>
    <mx:Button bottom="15" label="clear" click="clear()"  right="10"/>
    <mx:TextInput id="loop" left="10" bottom="15" width="40" textAlign="right" text="100"/>
    <mx:Label text="回繰り返す" bottom="15" left="50"/>
</mx:Application>