プログラミング基礎の基礎 No.004


プログラムコードの最適化。

 誰が見ても完璧なコードは無い

「プログラムコードの最適化。」
リクエストがあったので、ちょっと難しい話だが、最適化のポイントとコツを説明する。

プログラムコードの最適化は、プログラムを書く人にとっては、永遠の課題。
処理効率が良くて読みやすいコード。
極論を言ってしまうと、誰が見ても完璧なコードは無いのだ。
なぜならば、最適化をする要素は、相反する性質を持っていて、
開発環境やコンパイラの種類によっても、最適化の方法は変わってくるのだ。

だがしかし、最適化を意識してプログラムを書ければ、それに越したことは無い。
読みづらいコードや、無駄なコードも確かに存在するはずだから。

 まずは作業工程の話

最適化の説明の前に、プログラマーのお仕事、作業工程の話を少ししておこう。

開発の工程は、
「要求」「設計」「開発」「テスト」に大きく分けられる。
ISOの規格では、さらに詳細に分かれるのだが。

「要求」は、お客様の要求するモノを聞き出して、
「設計」で、プログラマーが作れる形に資料を作る。ここまではSEの仕事。
「開発」は、プログラムコードを書いて、設計通りに作成する作業で、
「テスト」は、出来たプログラムが要求通りに動くかテストをする。

プログラマーは、言ってみれば「サービス業」なので、お客様の要求に答えるのが目的。
良いプログラムは、お客様が満足するものなのだ。

 コンパイラと最適化

C言語などのコンパイラ言語には、コンパイル時に最適化を行う。
コンパイラには、オプションが付いていて、
「サイズを最適化」や「実行速度を最適化」等が選べる。(VBも5.0〜あるね。)

これらは、どういうことかと言うと、
サイズを小さくすると実行速度は遅くなり、実行速度を上げると、サイズが大きくなる。
と、言うことを言っているのだ。

例えば、ループの場合。
1.ループ内で同じ関数を10回呼び出す時。
2.ループ内に関数と同じ内容を10回書いた時。

1はコードは小さくなるが、関数呼び出しのオーバーヘッドがかかる。
2はコードは大きくなるが、関数呼び出しのオーバーヘッドは発生しない。

コンパイラの最適化が入るため、
一概に「ステップ数が少ないと速い」とは言えないのだ。

 メモリ効率と処理速度

メモリの大量使用は、ハードディスクへのスワップがかかってしまう。
なるべくメモりを使わないようにするのは最適化への近道。

処理速度は、長いプログラムよりは、要約された短いプログラムの方が速いね。
だけど、処理速度の最適化が生きる部分は、通常のプログラムコードよりも、
画面の描画やDBの検索処理など、時間のかかる部分ほど、最適化はしやすい。

最適化をする場合のコツは、無駄を減らすこと。
しかし、最適化をするにしても、時間には限りがある。
少ない時間の中で、効率よく最適化をするには、ループの中を最適化するのが良いだろう。
ループ内の処理が10msでも速くなれば、100回繰り返す場合1秒も変わってくるのだ。

 人間に優しいプログラム

プログラムは人間が書くものなので、
いくら素晴らしく効率的なプログラムであっても、人間が理解しづらいプログラムは、
決して良いものとは言えない。

プログラマーの仕事の話に戻るが、
テスト完了後に納品しても、プログラムにはバグが付き物だし、
お客様の要求が増えたり変わったりするかも知れない。
後に、修正が発生するのだ。

自分が書いたプログラムは、自分が修正するとは限らない。

自分の書いたプログラムの修正がまわってくることなんて、
ほとんどあり得なく、稀な事なのだ。
もちろん、ここはプロとアマの違いでもあるのだが、
プログラマーは、自分の書いたプログラムを人に見せても理解出来るような
プログラムを作るべきなのだ。
修正のしやすい、わかりやすいプログラムというのは、
メンテナンス性の高い、お客様にとって良いプログラムであると言えよう。

矛盾するが、人に優しいプログラム程、プログラム自体は無駄が多くなる。
双方を両立させることは不可能なので、冒頭の極論になってしまうのだが、
バランスの良いところで落ち着くべきだろう。

インデントやコメントなんて、当然説明するまでもなく的確に書くべきで、
多少わかりづらそうな処理については、コメントで補足するべきなのだ。
コメントはどんなに長く書こうとも、処理速度には全く関係が無いのだから。

 まとめ

プログラマーと一口に言っても、
僕の様な業務アプリケーションを作るプログラマーもいれば、
ハードへの組み込みプログラミングや、ゲームの作成のプログラマー等、
プログラマーにも種類がある。

コードの最適化は、その時と場所によって要求されるべき事が異なるので、
一概に「こうした方が良い」と定義付ける事は出来ないけれど、
自分の書いたプログラムの速度計測や、メモリ使用率・CPU使用率等、
書き方によってどう変化するか計測してみると良いだろう。

プログラムコードの最適化。プログラマーの永遠のテーマ。

大きい会社だと、ちゃんと「コードレビュー」を行うのだが、
自分の書いたコードを人に見せ説明する事によって、人の意見を聞き、
自分の考えに基づいた「良いプログラム」を書こう。
プログラムの書き方は、人の好みでだいぶ書き方が変わってくるのだけどね。

 戻る...