第4話 高速化の技法

--------------------- 第4話 高速化の技法 --------------------------

はじまり、はじまり~。

<よっ!、いよいよ本題ね。>
昔は、「遅い遅いと言うなら黙って、コンパイラを使え。」でした。
確かにコンパイラを使えば数倍から数十倍は速くなる。でも千倍は無理。

<100万馬力ですからね>
私はアトムか? それにインタプリタのUWSCだから、もとからナンセンスだな。

<じゃあどうするの?>
裏を返せば、極端に遅くならない技法だ。ネックな場合を知っておく事だな。

<何がそんなに遅いの?>
要点は二つ。ループの内側と遅い関数。ループは言うまでもないが、放置が多い。
遅い関数でも一回なら大したことはない。

ループ内で、値が変動しない定数は極力ループ外に出すべきだ。例えば、
id = getid("固定タイトル") なんてヤメテほしい。

要注意なのが、文字列関連の関数だ。一見遅くはないが、文字列が長いと激遅い。
今回もその例で、一つの変数にすべてを読み込んでいるので指数関数的に遅くなる。

<じゃあ、どうすればいいの?>
長い文字列を繰り返す場合は、配列に入れ直して、短く区切ることだ。
そうすれば、激遅にはならない。コレはコンパイラでも同じ。
初期のC言語は、文字列を配列として扱っていた。ある意味苦手な項目になっていた。

<な~る。他には?>
高速化のボトルネックを解消することだ。今回も最遅の項目に焦点を当てた。
また体感速度にも注意しよう。一秒以下ならどんなに高速化しても意味はない。
その意味では、今回は過剰な高速化になる。

<そっかー。一秒でも、一ミリ秒でも大差ないものね。>
まあ、UWSCでも数万件のデータなら扱えることを実証出来ただろう。
通常ならfgetで十分実用範囲に入るのではないかな。

<アルゴリズムを工夫して高速化するわけね。>
いや、ソレより前にデータ構造を検討すべきだね。
一つの文字列から配列に分割したようにね。

<だから、とんでもない高速化が出来たわけね。>
データ構造の見直しは、プログラムのシンプル化にも大いに貢献するよ。

<他には?>
そうポンポン出ては来ないが、データのコード化も工夫しよう。

<??どうゆう事>
今回は、特にコード化されていないが、通常データベースなどではIDを付ける。
要は目次を付けて、ソレで検索する訳だ。さらに一工夫すると効果的だよ。

<一工夫の部分は話が見えないんですけど・・・>
では具体的な数値で話をしよう。バイナリーサーチだからあの程度の速さなんだよ。

<あのー186万倍速なんですけど・・・>
本来完全一致なら連想配列で一発検索なので、銘柄コード分の配列(1万件分)を用意して
ソレに実際の行数を入れておく。空白部分は次の行で埋めておく。こうすると
多少配列は無駄になるが、高速で検索が可能になる。

<数字的には、何倍速になるの?>
5000件のデータ検索で5000件目を見つけるのにオリジナルでは2937秒もかかっている。
連想配列での検索は約0.04ミリ秒なので、ザーッと7342万倍速でしょうか。

<ほえ? いったいなに言ってんのコノ人。コレ掲示板にあった現実の話よね。>
<じょ、冗談にもほどがあるわ。実データの2000件にしても410万倍速よ。>
<実用範囲の5000件で7300万倍速? 桁がデカすぎて訳分かんないわ。>
まあ、元が遅すぎたのでこんなもんでしょ。

<いくら元が遅いと言っても、7000万倍も速くなるなんて・・・>
<そ~いえばお姉さまが、こんなこと言ってたわ。「いずれスクリプトに>
<驚いてLiners様って呼びたくなるから」ってコレはまさに・・・>

<い、いえ! アタシは騙されないんだからね。偶然よ偶然!>


----------------------------------------------------------------------

提供は:100万倍速なんて遅すぎ!。Linersでした。

----------------------------------------------------------------------