2011年1月1日土曜日

Tweenの高速化についてまとめ。その4

年も変わったんで、文体変えてみようかな。ちょっと固い感じがする。

と、さておき、Tweenの高速化についてまとめてみましたが、徐々に実際のコードをベースに、細かいところについて書いていこうと思います

まずは、以下のようなリンクリストのノードがあったとします。
public class Node{

    public var next:Node;

    public var val:uint;

    public function Node(val:uint, next:Node){
        this.val = val;
        this.next = next;
    }

    public function any():void{
        trace(this.val);
    }
}
では、これを処理するコードはというと、
//リンクリストを処理する関数の中と仮定
//_headはリンクリストの先頭のprivate var の値

//whileの場合
var node:Node = _head;
while(node !== null){
    node.any();
    node = node.next;
}

//forの場合
for(var node:Node = _head; node !== null; node = node.next){
    node.any();
}
という感じになると思います。もしも、「nodeが仕様上1つ以上ではあるが、実態としては1つのケースが多い」と仮定した場合、for/whileをすっ飛ばすことによって最適化することができます。
//リンクリストを処理する関数の中と仮定
//_headはリンクリストの先頭のprivate var の値

//whileの場合
if(_head.next === null){
    _head.any();
}else{
    var node:Node = _head;
    while(node !== null){
        node.any();
        node = node.next;
    }
}

//forの場合
if(_head.next === null){
    _head.any();
}else{
    for(var node:Node = _head; node !== null; node = node.next){
        node.any();
    }
}
できれば、anyという関数も、呼び出し元の所にインライン展開してしまったほうが、もっと高速に動きます。業務ロジックを1箇所に固めたほうが当然メンテナンス性も可読性も良く、品質も管理しやすいですが、冗長でも関数呼び出しを減らすことによって高速に動作します。関数呼び出しのオーバーヘッドは馬鹿になりません。

0 件のコメント:

コメントを投稿