メモリの極悪最適化方法2009年01月24日 10時52分32秒

メモリを開放しないのも、時と場所をわきまえればプログラムの大きな高速化に成り得る。自らのプログラム内では適切な処理をせずに、exit(0) してしまうのだ。やはり、プログラマたるもの正しく自らが malloc で割り当てたメモリは正しく free をしたい。そこで、時と場所をわきまえる必要はある。

この方法は、行儀の良い VM が実装されている OS である必要がある。free で開放されなかったメモリもしっかりと回収してくれる OS でないと出来ない。

実メモリの何倍ものメモリが必要に成るとしよう。そのような場合は、極力メモリの内容を避けるのである。実メモリが、256 MB しかないのに、1.5GB のメモリが必要と成るプログラムであれば、そのメモリの全部が一度スワップに書き出される。書き出された内容が必要になれば swap-in を起こすが、内容が変更されていなければ、再度 swap-out が起こることはない。これは、一度メモリ上の内容を他に割り当てる時に、破棄される事はある。しかし、既にこの内容は swap-out されているので、これを再度書き出す必要がないからである。もし、この 1.5GB の内容を何回も読み出さなければいけなくても、内容を変更しなければ swap-out するのは一度だけになる。

malloc/free の実装にもよるが、プログラムが終了するために、この 1.5B のメモリを次々に、free(ptr); ptr = NULL が内容を変更する為に、再度 swap-out する場合があるのだ。どうせ終了するだけなので、exit(0) を行なうと、OS が一気に開放してくれる。

上での 256MB というのは只の例で、GB 単位のメモリが標準になって来ている今日では、大した量ではない。しかし、大概にして時代の経過と共にメモリ搭載量は増えるが、それに追従してメモリ利用量も増える。restore(1) はファイルを全て書き出した後に、ファイルの最終修正時刻などを復元するために、各ファイルの情報をメモリに保持する。四年ぐらい前に、250GB のディスクを dump/restore しようとしたら、restore が 2.5 GB のメモリが必要になってしまった。その当時は、256MB から 512MB が一般的な PC のメモリだったと思う。最近は、2GB 以上のメモリを載せている安価な PC も良く目にするが、ディスクも TB の単位で手に入る。

良い子は正しく free をしましょう。しかし、free をするのに何十分単位で余計な時間が掛かるのなら、無礼講で。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2009/01/24/4077236/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。