プログラムの高速化について
■ 高速化は必要?
プログラムは速い方がいいと誰でも思うでしょう。特に遅いプログラムと取り掛かっているときはますますそう思うはずです。しかしプログラムの高速化のことはあまり重要視されていないかもしれません。実際、高速化についての解説はあまりありません。少なくとも「高速化」と「プログラミング」を検索エンジンにかけても満足するようなサイトが見当たりません。
確かに遅いプログラムでも速いマシンを使えば我慢できないことではないかもしれません。ちょっと古いパソコンを最新のものに買い換えれば、実行速度が2倍ぐらいになることはよくあります。しかし2倍程度で満足しては始まりません。管理者は大学時代の研究ではちょっとしたテクニックで5倍以上の高速化を達成した経験があります。さらにとあるCAE(Computer Aided Engineering=コンピューターに支援された技術)ソフトウェア企業に就職してから、既存のプログラムを、コードの高速化で10倍以上も高速化させた経験も持っています。ハードウェアの買い換えよりはまずプログラムの高速化をやった方が期待できる効果が高いわけです。そして何よりもプログラムを高速化さえすれば、コストは(プログラムを高速化させるときの)1回だけで済みますが、ハードウェアの買い換えでは使用するユーザー分だけコストがかかるので、トータル的にコストが高くなります。
管理者のようなCAE開発業務に携わるものにはよく「高速化」か「可読性」のどれかを選ぶべきか議論になります。高速化を追求すると大体解かりにくいプログラムになるし、逆に可読性を追求すると一般的にプログラムは遅くなります。言い換えれば、人間に解かりやすいものはコンピューターには解かりにくい(遅い)し、コンピューターに解かりやすいものは人間に解かりにくいです。使う側からするともちろん高速化が重要ですが、開発する側にとっては可読性は無視できません。管理者の見解としては高速化が優先すべきです。理由は開発は一回だけですが、プログラムの実行は何回もあるからです。確かに解読性の低下により開発スピードは遅くなるかもしれませんが、高速化によってその犠牲は今後何倍もの効果をもたらすはずです。
ただし可読性をまったく無視するのは賛成できません。高速化しながら可読性を維持できれば理想です。そのための常用手段はコメントでしょうか。高速化によって解かりにくい部分はコメントを入れて可読性を補えばきっと解かりやすくて速いプログラムに仕上がります。
■ 高速化手法にはどんなものがある?
プログラムを速く実行したいと思ったら、まず考えられるのはいいコンピューターを使うことです。しかしこれはプログラマーはどうすることはできず、コンピューター開発する人や企業とユーザーの資金力に任せましょう。このサイトでは範疇外とさせていただきます。このサイトで対象にしているのはハードウェアによらないプログラムの高速化です。
プログラムの高速化手法は大きく分けると、3種類あります。
○ 演算数を減らす
当然のことで演算数が少なければ実行するものも少ないから、プログラムの実行も速くなります。しかし演算を単純になくすだけでは計算がおかしくなり、目的の機能が得られなくなります。計算結果を変えない演算数の減らし方を使用べきです。このサイトではサンプルを交えながら演算数の減らし方を紹介します。
○ メモリアクセスのジャンプを減らす
意外と知られていないですが、メモリのアクセスはCPUの演算よりは数倍時間が掛かります。いくら速いCPUを使ってもメモリアクセスが頻繁に起こるとプログラムの実行が遅くなります。しかしデータがメモリに置いてある以上、データを使うためにメモリアクセスは避けられません。幸いコンピューターにはキャッシュメモリの仕組みが施されており、メモリアクセスを高速にしてくれます。ただメモリアクセスのジャンプが多いと、キャッシュメモリが機能しなくなるのでメモリアクセスのジャンプを減らすコーディングの仕方が重要です。このサイトではメモリアクセスのジャンプがよく起こる計算を紹介します。
○ 並列化
近年複数のCPUを持っているコンピューターは珍しくありません。プログラムを高速化しても限界があります。ハードウェアーの面でもCPUのクロック数はもう上がらないといわれています。そこで注目されているのは並列化です。つまり複数のCPUを同時に動かせて一緒に一つの計算をします。並列化でもいろいろと種類があって、同一のコンピューター内の複数のCPUによる並列化もあるし、別々のコンピューターのCPUによる並列化もあります。前者のプログラミングは比較的に簡単ですが、後者は難易度が高い傾向があります。並列化については時間の関係で取り上げないことにします。時間ができたらこのサイトにも解説したいと思っております。