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