IF文を制する者はBASICを制す

PART 3 IF文は論理式よりも速い!?


 「IF文は論理式より遅い」というイメージがあり、IF文の代わりに論理式を使うことで高速化ができると思われているとPART1で書きました。それはIF文の条件式は論理式として処理がされているからです。
 しかし、PART2で書いたような論理式ではなく減算で表記することで高速化が可能になっています。さらにIF文の場合は条件式が成立したときしかTHEN以下を実行しないために平均的に考えるとそこまで遅くはないのです。
 それはどういうことかというと次のIF文を見てください。

 IF K=6 THEN X=X+1

これを論理式で表現するとX=X-(K=6)となります。この同じ動作をするIF文と論理式とでどちらが速くなるのかはこの条件式であるK=6が成立するか否かによって変わってきますので実際に処理時間を計測してみました。

K=6が成立K=6が不成立
IF文
6.3m秒
3.2m秒
論理式
5.7m秒
5.5m秒

 これを見るとK=6が成立したときは論理式の方が速く、不成立のときはIF文の方が速いことが分かります。このIF文において考えるならば、平均処理速度を計算するとK=6が成立する確率が80%以上の場合のみ論理式の方が速くなります
 このIF文においてPART2で書いた高速化を行ってみます。

 IF K-6 THEN ELSE X=X+1

 この場合にIF文と論理式の処理時間を計測すると下記のようになります。

K=6が成立K=6が不成立
IF文
6.3m秒
3.0m秒
論理式
5.7m秒
5.5m秒

 これによって、IF文の方が速くなる確率がさらに上がりました。
 IF文は論理式よりも遅いというのは正しいとはいえないことが分かると思います。大半の場合、IF文の方が論理式よりも速くなっているわけですからね。だから「論理式ですっきり」のところで書いたようにIF文を論理式に置き換えるのは速くするのが目的ではなく見た目をすっきりさせるためと私は考えています。(「高速化」ではなく「すっきり」というテクニック名になったのはそのため)

 しかし、論理式で記述することで条件が成立した場合も不成立の場合も速度の変化がないというのはメリットととらえる人もいるでしょう。確かに、速度が全体的に安定している方が望ましく全体的に速くても一部だけ処理速度が落ちるのは望ましくないというのも分からなくはないです。IF文1個につき条件式を満たしたときと満たさなかったときの速度の差が論理式と比べて約3m秒も大きいわけですからIF文の数が増えれば増えるほど速度差は大きくなる・・・と考えがちですが果たしてそうでしょうか?
 実際はメインルーチンで使われているIF文ですべて条件式を満たしたり、すべて条件式を満たさなかったりというパターンを繰り返すことはほとんどなく、数が多ければ平均化されるため1個につき3m秒の差があるからといってメインルーチン内でIF文を10個使えば30m秒の差が発生するなんてことはまずありません。今回の例のようにTHEN以下がX=X+1ではなくさらに複雑で処理に時間がかかるものだと速度差は3m秒よりも大きくなるのですが、その場合は論理式で表記するのが困難になりますから平均的な速度はIF文の方がさらに有利となります。

 そもそも、処理速度が遅いときと速い時の差を気にするのであればゲームならばスコアが加算されたときのPRINT文と同じだけの時間ほどスコアが加算されないときにウエイトを入れたり、BEEPの効果音を鳴らした分の時間ほど鳴らない時もウエイトを入れなくてはならなくなります。つまり、理論上最も遅くなる状態に速度を合わせるわけです。そんな調整をしても、キーを押している時にはキー割り込みによって処理速度が約15%ダウンするくらいだからBASICにおいて微妙な速度調整は無意味といえるでしょう。
 とはいえ、PCなどでゲームを作る場合はタイマー割り込みによって速度を一定に保つというのは非常に意味があります。PCの場合は環境によって速度が異なりますから速いPCでプレイしたらキャラの動きが速くなっては困りますからね。BASICではタイマー割り込みは使えないし環境が固定化され、速度が遅いポケコンにおいてはPCなどとは別物と考えた方が良いでしょう。
 したがって、ほとんど無意味なIF文における条件式の成立、不成立時の速度の落差よりも全体的な平均速度の方が重要だと思います。平均速度を見ればほとんどの場合において論理式よりもIF文の方が速くなることがこの章で分かってもらえたと思います。

PART4に続く


PART 1 IF〜THEN〜の動作の基本について
PART 2 条件式の簡略化(基本編)
PART 3 IF文は論理式よりも速い!?
PART 4 IF文の簡略化(応用編)
PART 5 IF文の簡略化(実戦編)
PART 6 IF文を制するには・・・

RETURN

inserted by FC2 system