プログラミング基礎の基礎 No.004
プログラムコードの最適化。
誰が見ても完璧なコードは無い
「プログラムコードの最適化。」
リクエストがあったので、ちょっと難しい話だが、最適化のポイントとコツを説明する。プログラムコードの最適化は、プログラムを書く人にとっては、永遠の課題。
処理効率が良くて読みやすいコード。
極論を言ってしまうと、誰が見ても完璧なコードは無いのだ。
なぜならば、最適化をする要素は、相反する性質を持っていて、
開発環境やコンパイラの種類によっても、最適化の方法は変わってくるのだ。だがしかし、最適化を意識してプログラムを書ければ、それに越したことは無い。
読みづらいコードや、無駄なコードも確かに存在するはずだから。まずは作業工程の話
最適化の説明の前に、プログラマーのお仕事、作業工程の話を少ししておこう。
開発の工程は、
「要求」「設計」「開発」「テスト」に大きく分けられる。
ISOの規格では、さらに詳細に分かれるのだが。「要求」は、お客様の要求するモノを聞き出して、
「設計」で、プログラマーが作れる形に資料を作る。ここまではSEの仕事。
「開発」は、プログラムコードを書いて、設計通りに作成する作業で、
「テスト」は、出来たプログラムが要求通りに動くかテストをする。プログラマーは、言ってみれば「サービス業」なので、お客様の要求に答えるのが目的。
良いプログラムは、お客様が満足するものなのだ。コンパイラと最適化
C言語などのコンパイラ言語には、コンパイル時に最適化を行う。
コンパイラには、オプションが付いていて、
「サイズを最適化」や「実行速度を最適化」等が選べる。(VBも5.0〜あるね。)これらは、どういうことかと言うと、
サイズを小さくすると実行速度は遅くなり、実行速度を上げると、サイズが大きくなる。
と、言うことを言っているのだ。例えば、ループの場合。
1.ループ内で同じ関数を10回呼び出す時。
2.ループ内に関数と同じ内容を10回書いた時。1はコードは小さくなるが、関数呼び出しのオーバーヘッドがかかる。
2はコードは大きくなるが、関数呼び出しのオーバーヘッドは発生しない。コンパイラの最適化が入るため、
一概に「ステップ数が少ないと速い」とは言えないのだ。メモリ効率と処理速度
メモリの大量使用は、ハードディスクへのスワップがかかってしまう。
なるべくメモりを使わないようにするのは最適化への近道。処理速度は、長いプログラムよりは、要約された短いプログラムの方が速いね。
だけど、処理速度の最適化が生きる部分は、通常のプログラムコードよりも、
画面の描画やDBの検索処理など、時間のかかる部分ほど、最適化はしやすい。最適化をする場合のコツは、無駄を減らすこと。
しかし、最適化をするにしても、時間には限りがある。
少ない時間の中で、効率よく最適化をするには、ループの中を最適化するのが良いだろう。
ループ内の処理が10msでも速くなれば、100回繰り返す場合1秒も変わってくるのだ。人間に優しいプログラム
プログラムは人間が書くものなので、
いくら素晴らしく効率的なプログラムであっても、人間が理解しづらいプログラムは、
決して良いものとは言えない。プログラマーの仕事の話に戻るが、
テスト完了後に納品しても、プログラムにはバグが付き物だし、
お客様の要求が増えたり変わったりするかも知れない。
後に、修正が発生するのだ。自分が書いたプログラムは、自分が修正するとは限らない。
自分の書いたプログラムの修正がまわってくることなんて、
ほとんどあり得なく、稀な事なのだ。
もちろん、ここはプロとアマの違いでもあるのだが、
プログラマーは、自分の書いたプログラムを人に見せても理解出来るような
プログラムを作るべきなのだ。
修正のしやすい、わかりやすいプログラムというのは、
メンテナンス性の高い、お客様にとって良いプログラムであると言えよう。矛盾するが、人に優しいプログラム程、プログラム自体は無駄が多くなる。
双方を両立させることは不可能なので、冒頭の極論になってしまうのだが、
バランスの良いところで落ち着くべきだろう。インデントやコメントなんて、当然説明するまでもなく的確に書くべきで、
多少わかりづらそうな処理については、コメントで補足するべきなのだ。
コメントはどんなに長く書こうとも、処理速度には全く関係が無いのだから。まとめ
プログラマーと一口に言っても、
僕の様な業務アプリケーションを作るプログラマーもいれば、
ハードへの組み込みプログラミングや、ゲームの作成のプログラマー等、
プログラマーにも種類がある。コードの最適化は、その時と場所によって要求されるべき事が異なるので、
一概に「こうした方が良い」と定義付ける事は出来ないけれど、
自分の書いたプログラムの速度計測や、メモリ使用率・CPU使用率等、
書き方によってどう変化するか計測してみると良いだろう。プログラムコードの最適化。プログラマーの永遠のテーマ。
大きい会社だと、ちゃんと「コードレビュー」を行うのだが、
自分の書いたコードを人に見せ説明する事によって、人の意見を聞き、
自分の考えに基づいた「良いプログラム」を書こう。
プログラムの書き方は、人の好みでだいぶ書き方が変わってくるのだけどね。