2013-10-11

ビル・ゲイツ曰く、「俺は飛行機の中でFAT書いたこともあるんだぞ、アホンダラ」

I wrote FAT on an airplane, for heaven's sake - The Old New Thing - Site Home - MSDN Blogs

16-bit Windows用にコードを書く時、パフォーマンスの最適化として割く時間には、どの関数をどのセグメントに置くかということがある。

16-bit Windowsにおけるコードは、コードセグメントの中から実行される、セグメントのサイズは64KBである。コードセグメントがひとつディスクからロードされるときは、そのセグメント全体がロードされるし、セグメントが破棄される時には、そのセグメント全体が破棄される。つまり、関数がどのセグメントに配置されているかということは、アプリケーションのパフォーマンスに多大な影響を及ぼすのだ。

例えば、同時に呼ばれる関数群を同じセグメントに配置しておくのは都合がいい。そうすれば、関数群は一個のものとして読み込まれ、I/O時間を節約できる。考えなしに関連性のない関数を同じセグメントに配置したならば、セグメント上の関数を呼び出すと、他の関数まですべてロードされてしまい、使わない関数までロードするので、I/Oを浪費する。

たとえ関数が同時に呼ばれるとしても、その頻度には目を配っておかなければならない。頻繁に呼ばれる関数と、頻繁に呼ばれない関数(ただし最初の関数の後に呼ばれる)がある場合、頻度の低い関数は、虎の威を借りてメモリにロードされたままになる。これにより、メモリ使用量が上がり、容量を開けるために、頻繁に呼ばれる関数が破棄されることもある。

セグメントを細かく大量に作ると、メモリ使用量を細かく管理できるが、その分オーバーヘッドも多いし、I/Oにも負担がかかる。なぜならば、セグメントをロードするという事は、ディスクへのラウンドトリップだからだ。そのため、メモリー使用量とI/Oのコストのバランスを取らなければならない。

関数群をセグメントに配置する最適化を、セグメントチューニングと呼ぶ。

Windows 3.0の開発中、定期的な会議でビル・ゲイツに進捗を報告することになっていた。ある会議の議題はパフォーマンスで、ビルは、「てめーらセグメントチューニングに時間かけすぎだろ。セグメントチューンなんて12歳のガキにだってできらぁ。もっと本物の最適化をやれ。こんな馬鹿馬鹿しいセグメントチューニングじゃなくてよ。おれは飛行機の中でFAT書いたこともあるんだぞ、アホンダラ」と文句をつけた。

(やれやれ、こういうことを書くことになるとは。これは議事録ではなく、やや脚色されている)

この、「俺は飛行機の中でFAT書いたこともあるんだぞ」というのは、ビルが本物のプログラミングをしていないと感じた連中に文句をつける時のセリフらしい。だが、今回ばかりは、開発マネージャーはうんざりしたので、こう言った。

「あらそうなの、ビルさん。では、Windowsのソースコードが入ったマシンをご用意いたしますので、あなたの魔法のプログラミングとやらを発揮して最適化を手伝ってくださるかしら?」

これにより、ビルを黙らせた。

久々にOld New Thing。

コメント欄では、「悲しいかな、もしビルがFATの開発にもっと時間をかけていれば、もう少しはマシなものになったものを」とか、「飛行機の中で書いたから何だっていうんだ。なんにも変わらんだろ」などと言われている。特に、この時代のプログラミングというのは、当初の記述は紙の上で行われることも多かったので、なおさら変わらない。

ところで、この開発マネージャーというのは原文では女性という事になっているのだが、日本語ではセリフの言い回し以外に自然な方法でその情報を表現できないのは難しい。

No comments: