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

PART 2 条件式の簡略化(基本編)


 PART1においてIF A<>0 THEN BEEP 4IF A THEN BEEP 4と同じことというのが分かったと思います。これによって、「<>0」の分だけメモリが節約できるだけでなく、「A<>0」という条件式の値(成立するならば-1、不成立ならば0)を求める時間を省略できる分だけ高速化もできるのです。
 しかし、「=」は条件式でよく使われるのに対して「<>」を使う機会はそれほど多くはありません。しかも、「<>0(0以外)」を条件式に使えるのは極めて限られます。したがって、もっと多くの場合に適用できるものを考えていきます。

 では、IF(条件式)THEN(実行文1)ELSE(実行文2)というIF文はどのような場合に(条件式1)、(条件式2)が実行されるでしょうか?
 PART1で書いたことを踏まえればすぐに分かると思いますが(条件式)の部分が0の時は(実行文2)、0以外の時は(実行文1)が実行されます。それを頭に入れた上で次のIF文を見てください。

 IF A=2 THEN 30 ELSE 50

 このIF文を高速化する方法を考えます。このIF文はA=2の時にTHEN以下が実行されるというのは分かりますが、それは論理式(A=2)が真の時になります。A=2の右辺を左辺に移項するとA-2=0となります。よって、上記IF文は次のようにできます。

 IF A-2=0 THEN 30 ELSE 50

 条件式が0か0以外かによって実行されるのがELSE以下かTHEN以下か決まってくるので条件式を反転すれば実行されるTHEN以下、ELSE以下も同じように逆転することになります。それを考えると上記IF文は次のように変えることができます。

 IF A-2<>0 THEN 50 ELSE 30

 ここで「<>0」は省略可能なため最終的にはこうなります。

 IF A-2 THEN 50 ELSE 30

 見た目は最初とあまり変わっていませんが、論理式よりも減算の方が処理が速いため高速化が実現できるわけです。

減算FOR I=1 TO 1000:B=A-2:NEXT
論理式FOR I=1 TO 1000:B=A=2:NEXT

 この比較では減算の方が0.3秒速くなっています。
 ※C言語ではB=A=2はA=2、B=Aを1つにまとめたものだけどBASICの場合はB=(A=2)という論理式の括弧を省略したものとなる

 今回は初心者にも分かるように移項しながら分かりやすく書いたのですが、慣れたら最初の形からこの最終形にすぐに変形できます。条件式で「=」を使う頻度は高いためこのテクニックが使える場面は非常に多いと思います。
 THEN以下とELSE以下が逆転している関係上条件式が成立した場合(上記IF文ではA=2の場合)においてはELSEの処理が増える分と相殺されてしまうため速度面の向上はほとんどないですが、条件が不成立の時には変形前に3.5m秒だったのが3.0m秒へと0.5m秒速くなっています。

PART3に続く


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

RETURN

inserted by FC2 system