A Day in the Life

2008-01-30

AS3 URI ハッシュの設定・ハッシュからデータの復元

// 設定
JSProxy.proxy.location.$hash = JSUtil.buildQueryString(hash);
// 復元
var hash:Object = JSUtil.restoreQueryString(JSProxy.proxy.location.$hash);

JSProxy 便利だなー。

今日の windows さん

Luna が変になった。

f:id:secondlife:20080130170131p:image

fu部・要望

http://localhost:3000/http://localhost/ みたいな URI がクリップボードにある場合でも Ctrl+Shift+v で URL を開いて欲しい!(お仕事一区切りお疲れ様です)

Array vs Class

わんぱーくと話してて、頂点座標は Array で持つべきか、x,y,z なプロパティを持つクラスで持つべきかどっちの方が速いんだろうねーていうか計ればわかるよね話になったのでベンチ取ってみた。Shibuya.abc なひとならたまりんでアゼンブラ命令見てどっちが速いか判断するんだろうけど普通にベンチで。

array new instance: 13ms
array get: 3475ms
array set: 11571ms
class new instance: 31ms
class get: 2649ms
class set: 7736ms

追記・コメントで munegon さんに class の set が違うことを教えて貰った(ベンチなのに間違えるなんて…)ので計測し直したらちょっと set が遅くなりました。

結果としては型指定したクラスの方がget/setは速かった。インスタンス作成は array の方が速い。使い勝手も考えてクラスだなー。以下ソース。この測定方法辺だよねーという人は教えてください!

package {
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import com.rails2u.debug.Benchmark;

    [SWF(frameRate=60, background=0x000000)]
    public class Bench extends Sprite {
        public function Bench() {
            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;
            init();
        }

        public var instances:uint = 10000;
        public var getTimes:uint = 1000;
        public var setTimes:uint = 1000;

        public function init():void {
            var i:uint, j:uint;
            var ary:Array;
            var a:Number, b:Number, c:Number;
            Benchmark.start('array new instance');
            ary = [];
            var ar:Array;
            for (i = 0; i < instances; i++) {
                ary.push([Math.random(), Math.random(), Math.random()]);
            }
            Benchmark.end('array new instance');
            Benchmark.start('array get');
            for (j = 0; j < getTimes; j++)
                for (i = 0; i < instances; i++) {
                    ar = ary[i];
                    a = ar[0];
                    b = ar[1];
                    c = ar[2];
                }
            Benchmark.end('array get');
            Benchmark.start('array set');
            for (j = 0; j < setTimes; j++)
                for (i = 0; i < instances; i++) {
                    ar = ary[i];
                    ar[0] = Math.random();
                    ar[1] = Math.random();
                    ar[2] = Math.random();
                }
            Benchmark.end('array set');

            Benchmark.start('class new instance');
            ary = [];
            var p3:Point3;
            for (i = 0; i < instances; i++) {
                ary.push(new Point3(Math.random(), Math.random(), Math.random()));
            }
            Benchmark.end('class new instance');
            Benchmark.start('class get');
            for (j = 0; j < getTimes; j++)
                for (i = 0; i < instances; i++) {
                    p3 = ary[i];
                    a = p3.x;
                    b = p3.y;
                    c = p3.z;
                }
            Benchmark.end('class get');
            Benchmark.start('class set');
            for (j = 0; j < setTimes; j++)
                for (i = 0; i < instances; i++) {
                    p3 = ary[i];
                    p3.x = Math.random();
                    p3.y = Math.random();
                    p3.z = Math.random();
                }
            Benchmark.end('class set');
        }
    }
}

class Point3 {
    public var x:Number;
    public var y:Number;
    public var z:Number;
    public function Point3(x:Number, y:Number, z:Number) {
        this.x = x;
        this.y = y;
        this.z = z;
    }
}
記事の一覧 >