と、さておき、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 件のコメント:
コメントを投稿