30.if文の謎

if文の判定順序

いや、「if文の謎」ってタイトルほど謎でもないんだけど(^^;

前から疑問に思っていたことを実験してみたのでそのメモであります。

例えば、以下のようなif文があるとします。

if ( (flag1)&&(flag2) ){
trace("both true");
}

単に条件式が二つあって両方trueなら何か処理をするよ、というよくあるif文です。

前から疑問に思っていた、というのはこの文でいうと、flag1がfalseだった場合、flag2がどうかという処理をFLASH PLAYERは実行するのか?

きっとしないよね?無駄なわけだし、、、

そう自分では思っているものの、調べてもよくわからず、、、簡単な実験をしました。

下の二つは最初の条件式の<>の向きが違うだけです。

Math.random()は0〜1の乱数を生成します。変数countはあまり意味ないです。

もし、最初の条件式の結果にかかわらず、全ての条件式を評価するならパターン1、2で処理時間に差はないはずです。

//パターン1
var ii:uint , count:uint=0;
for (ii=0;ii<1000000;ii++){
if ( (Math.random() < 0.05)&&(Math.random() > 0.95) ){//パターン1
count++;
}
}
//パターン2
var ii:uint , count:uint=0;
for (ii=0;ii<1000000;ii++){
if ( (Math.random() > 0.05)&&(Math.random() > 0.95) ){//パターン2
count++;
}
}

で、実際にやってみたところ、30回ずつ行った場合の平均処理時間は

パターン1 約110msec

パターン2 約160msec

とやはりパターン1の方が早い、という結果になりました。

つまり、if文では条件式を順に評価していき、満たさないとわかった時点で後のは評価さえしない、ということですね。

ループの中で何回も通るif文ならなるべくif文をはずれる条件式から書いた方が処理が軽くなるってことになります。

予想通りとはいえ、すっきりしました。(^^)

→31.すごく時間のかかる処理

29.配列まとめ3←