E500BASIC高速化のすべて

PART 2 効率的な高速化を行うためには


 具体的な話に入る前にまずは一般論について書いていくことにしましょう。
 一般的に処理速度の高速化を図る場合にはボトルネックとなっている部分の改善をすることが最も効果があります。ゲームにおいては表示、演算、条件判断など様々な部分によって構成されていますが、例えばゲームのメインルーチンが処理A処理B処理Cで構成されているとします。

処理Aにかかる時間・・・メインルーチン全体の50%
処理Bにかかる時間・・・メインルーチン全体の30%
処理Cにかかる時間・・・メインルーチン全体の20%

 ここで各処理を2倍速(処理時間を50%)にする場合を考えてみます。処理Aを2倍速にした場合はメインルーチン全体では25%処理時間が短くなり、メインルーチン全体の処理時間は75%となります。また、処理Cを2倍速にした場合はメインルーチン全体では10%処理時間が短くなり、メインルーチン全体の処理時間は90%となります。
 処理Aを2倍速した場合は全体で約1.33倍速になるのに対して処理Cを2倍速にした場合は約1.11倍速に止まり、どの部分の処理を高速化するでその実行時間は大きく変わってくるわけです。同じ割合で高速化を行えるならば時間がかかっている処理をまずは高速化した方が良いというのはこれで分かると思います。

 では、メインルーチン全体を2倍速にするにはどうしたら良いのでしょうか?
 ここで処理Cを10倍速にした場合を考えてみるとメインルーチン全体では18%処理時間が短くなり、メインルーチン全体の処理時間は82%でしかないため一部だけを高速化しても限界があるということが分かると思います。それは処理A処理Bについて考えても同様ですね。
 もしも、処理Aにかかる時間が全体の90%という極めて時間がかかる処理であればその部分だけを2.25倍速にすればメインルーチン全体の処理時間は半分になる(2倍速になる)ために大きなボトルネックがあれば速度向上効果は大きく部分的な高速化だけで全体を飛躍的に速くすることは可能です。
 上記処理Aが仮に3倍速にできた場合、処理Aの時間よりも処理B処理Cの方が時間がかかりその部分がボトルネックとなります。このようにボトルネック部分は固定的なものではなく変動的なものなので一部だけを高速化しても限界があり高速化効果が薄くなるわけです。ちなみに処理A、処理B、処理Cをすべて2倍速にすれば全体で2倍速になるというのは分かると思います。

 効果的な処理速度の高速化を図るにはどの処理にどの程度の時間がかかっているかを把握することが重要ということが分かってもらえたでしょうか。一生懸命高速化について考えていてもあまり高速化ができないという場合は上記の例でいうと処理Cのようなあまり高速化効果を得にくいものばかりに気を取られていて速くならないと言っているようなことが多いのです。一部分だけを見てそれを高速化してもその一部がメインルーチンの大半の処理時間を占めるようなものでない限りは思ったような高速化効果は得られず、それによって「BASICの高速化はたかが知れてる」と思っている人が多くなっているのではないでしょうか。
 しかし、問題はどの処理にどの程度の時間がかかっているかなんていうことは普通は分からないということです。慣れてしまえばリストを見ただけである程度の処理時間が分かるようになるとはいえ、いきなりそこまでを求めるのは無理があります。さすがにプログラミングの際はストップウォッチを常備しておけなんて言うのも酷ですしね。(私は限界までの高速化をする場合はストップウォッチは必需品となっていますが)
 私はPJやベーマガに掲載されたBASICのゲームプログラムにおいてメインルーチン全体の平均実行速度を3倍程度に高速化してきたわけですが、これがどのようにして行われるかを次から書いていきます。

PART3に続く


PART 1 なぜBASICを高速化するのか
PART 2 効率的な高速化を行うためには
PART 3 BASICの高速化とは
PART 4 どうやったらBASICが高速化できるのか
PART 5 アルゴリズムの見直し
PART 6 メインルーチンの軽量化
PART 7 表示を高速化
PART 8 IF文をうまく使う
PART 9 「BASICだから遅い」は言い訳の言葉

RETURN

inserted by FC2 system