|
ファイル入出力の効率化
プログラムはハードウェア上で実行されます。ということは、プログラムの実行速度は、結局はハードウェアの性能に依存します。
プログラムをチューニングしようと考える場合、ハードウェアとは切り離してソフトウェア的な効率化だけを考えがちですが、最終的にプログラムがハードウェア上で実行される以上は、いかに効率的にハードウェアを使うかということを前提にした上でチューニングをする必要があります。
例えば、最近主流になってきているデュアルコアCPUの性能を最大限に使うためには、プログラムをマルチスレッド化して並列処理をする必要があります。シングルスレッドでは、CPUの性能がたった半分しか生かされません。
ここでは、ファイル入出力について考えてみます。ファイルはディスク(ハードディスク)上に作られます。ディスクのアクセス速度は、メインメモリのアクセス速度に比べると遥かに遅いです。メインメモリの方が大体10倍ぐらい高速にアクセスできます。
ということは、チューニングの観点から言うと、実行頻度が同じである場合、メモリアクセスの効率化をするよりも、ファイル入出力の効率化をしたほうが10倍効果が高いということです。1箇所の無駄なファイルアクセスを無くすことは、10箇所の無駄なメモリアクセスを無くすのと同じだけの効果があります。
ファイル入出力の効率化で、一番単純で効果の高い方法は、プログラムで使うファイルの内容を、全部メモリ上に置いてしまうことです。プログラム起動時に、必要なデータファイルを全部メモリ上に読み込んで、データへの読み書きは、読み込んだメモリに対して行います。そしてプログラム終了時にファイルに書き出します。
このようにするとディスクアクセスの頻度が最小限になります。毎回ディスクに読み書きするよりも格段に高速化されます。ひたすらファイルアクセスを繰り返すようなプログラムであれば、単純に10倍の速度になります。(ただし他のプログラムからデータファイルを参照されるような場合は、このように単純にはいきません。また、OSやAPIにバッファリング機能がある場合は10倍にはなりません。)
最近のPCは搭載メモリ量が増えてきているので、メモリ使用量よりもパフォーマンスを優先したプログラムを作ることができるようになってきました。多少の大きさのデータであれば、メモリ上に全部読み込んでしまうことができます。
また、もう一つの原始的な方法は、「まとめ読み」「まとめ書き」をすることです。これは、細切れでファイルの読み書きをしないで、まとめて読み書きをすることです。書き込みの場合、まずメモリ上に書き込みたいデータの塊を作ってから、一回の書き込み処理でまとめてファイルに書き込みます。読み込むときは、必要なデータが全部取れるだけの領域を確保してから、まとめて一度に読み込みます。こうするとファイルアクセス回数が減らせるので、高速化できます。
単純にファイル入出力をするのに比べて、1段階ステップを置かなければいけないので、その分プログラムは高度になりますが、効果は高いです。
|