目次次「理解力」 English

実行速度


プログラムは誰が作っても似たようなものと思っているだろう。Aが作った プログラムをBが作り直したら二倍速くなったら、Bはすごい奴と思うであろ う。

だが、この程度のことは驚くには当たらない。ちょっと工夫をしたら二倍速 くなるなど、ごく普通のことである。それよりも、コンピュータの性能はぐん ぐん上がっているので、新しいコンピュータに切り換えたら2倍以上も速くな るのは今や常識である。

では、上手と下手とで、できたプログラムの速度はどのくらいの差がつくも のであろうか。一応、下手でもプログラムを完成できると仮定しての話である。

実は今、ある会社が売り出しているパソコンのソフトがあまりにも下手で、 ちょっとでも難しい処理をさせると一晩かかっても結果が出てこない。つまり、 人間が手作業でやるより遅いのである。よくも恥ずかしくもなくこんな超下手 糞なソフトを売りつけて、まったく詐欺ではないか、ということを仲間と話し た。

では、どのくらいの時間で処理できるであろうか。まあ簡単な問題だから、 ちょっと解いてみるか、ということで数時間の作業で、ある程度の目安が立つ ところまでプログラムを作り上げた。すると、殆どの場合、数秒もあれば答が 出てしまう。

あの下手糞なプログラムは、いったいどうやってあんなに遅いのであろうか。 商品は手に入れることはできるが、どうしてそんなにのろまなのかを知る情報 は入手できない。きっとあまりに遅いので、その解法(プログラム)は極秘な のだろう。

こちらのプログラムもきちんと完成させ、最終的にどのくらいの差が出るか を調べてみた。商品のプログラムで、やや難しい処理をさせたら、実行時間が 50分であった。私の試作プログラムを同じ条件で実行すると約15秒であっ た。つまり、200倍の速度差が出てしまったのである。200倍の差は、 「まあいいや」といって妥協することができる筈がない。

ファーストフードレストランで、ハンバーガー1つ注文しただけなら、まあ 15秒くらいでできるかなと思うであろう。まあ、15秒が1分になっても、 まあちょっとのろまの店員だなと思って我慢することもできるであろう。しか し、もし50分もかかるのなら絶対にその店には二度と行かないであろうし、 まあそんな店はあっという間に潰れてしまうであろう。

つまり、このくらい速度差が出てくると、速度というレベルの差ではなく、 完全に質的な差になってしまう。もしコンピュータで50分かかるのなら、そ れは相当複雑で、めったに実行してはならない処理である。しかし、15秒で できるのなら、気軽に実行して構わない処理である。

データを入れてから結果が出るまで15秒間なら、コンピュータの前で待つ ことは苦痛ではない。しかしだ、50分も待っているなんてことは、気の短い 私にはとてもできない。世の人々は心穏やかに50分間待っているのであろう か。

極めて速くなったことは、質的な変化だけでなく、時間的なゆとりをもたら す。いつ結果が出るかと待つこともなく、さらに複雑な場合を処理させたり、 全く別の仕事をするなり、休息するなり、自由にできる時間が増えるのである。

それ以上に、精神的な安定を与える。コンピュータを操作しているとき、結 果がすぐ出てくれば安心である。何らかの操作をしたにも関わらず、コンピュー タが何の反応もしなかったら不安になる。コンピュータはちゃんと動いている のだろうかと疑うであろう。もしかして、自分の操作に誤りがあり、コンピュー タにまだ指示が受け付けられていないと勘違いして、何度も同じ操作を繰り返 しかねない。こういう状態がしばしば発生するようでは、殆ど使いものになら ない。

数百倍という速度差は一体どこから出てしまったのだろうか。詳しい理由は、 遅い方のプログラムが入手できないので分からないが、私の想像を絶する悠長 な方法を考え出して使っているのであろう。

例えば、1から100までの整数を加えるといくつか、という問題を解くの に、1から順に加えたら相当大変である。これは、100×101/2=50 50となる。公式を知っていれば、簡単な問題である。公式も知らず、公式の ような計算の仕方も思いつかないと、ひたすら順番に足していくしかないだろ う。そんな方法でも、100までなら何とか実行可能だが、もし10000ま での加算だったら、筆算や電卓で行なうのは絶対に不可能になってしまう。

結局、公式を知っているとか、上手い計算方法を見つけ出せる能力が物をい う。プログラムは、どのような手順で行なうかを、コンピュータにも分かる言 葉で書いたものに過ぎない。そして、「どのような手順」という部分は、今の ところ人間がコンピュータに教えてやるしかない。だから、この手順をプログ ラマがどう教えたかによって何百倍もの差が出たのである。

この手順あるいは手法のことを、コンピュータの世界ではもっともらしく 「アルゴリズム」という。

もう一例示そう。会社名から電話番号を電話帳で捜すことを考えよう。個人 の住所録から捜すのなら、最初から順に調べても大したことはない。しかし、 東京都の電話帳を、最初から順に見ていったら、完全な馬鹿である。名前があ いうえお順に並んでいるのや、職業別、地域別に並んでいるのを利用して捜し 出すであろう。

コンピュータで大量のデータの中から必要なデータを捜し出すことは、もっ とも良く行なわれることである。当然速くなければいけない。コンピュータが いくら高速だからといっても、最初のデータから順に調べていったので、相当 の時間がかかって使い物にならない。少しでも速くデータを捜し出すアルゴリ ズムは、コンピュータサイエンスの重要なテーマで、基礎的な知識は、コンピュー タ技術者たるもの、必ず身に付けていなければならない。

しかし、世の中では、最初から順番に調べるような方法しか知らない、どう しようもない無能な技術者がいっぱいいる。こんなのにプログラムを作らせた ら、何を作らせても、どうしてそんなに遅いのかと思案に暮れるような驚嘆す べきものをでっち上げてくれる。

こういう、完全無欠の無能プログラマに限って、自分の力に自信を持ってい る。全く救い難い。


我輩は猫である


Copyright1996 Hirofumi Fujiwara. No reproduction or republication without written permission
目次次「理解力」 English