開発
学校じゃ教えてくれないC言語 最適化!?編
Takeyuki Sato
昔、プリンストン大学で学内向けの小さなプログラミングコンテストをしていました。
ある年、1万を超える数値データ(当時ではかなり大きい)からデータを読み出しそれらの平均をとってできるだけ高速にその解をとってくるという単純問題が大騒ぎになりました。
最適化というと、コンパイラーのオプションからかけ算のシフト演算、バッファーオバーチェックの省略、共通部分式の抽出などあります。しかし、その学生らが出した速度は予想を大きく外した。
一位の学生は、もはや本問題からかけ離れた方法で勝利した。OSの制御ブロックのCPU-time-ised フィールドを大きな値にしご認識させ時間を負の数にした。
二位の学生は、ふたつのファイルを読み込み一つのファイルを計算で、もう一つのプログラムをsleepさせときたまに解が求まったかチャックするするとそのプログラムの実行時間はかなり小さい。
三位の学生は、最適化されたコード(マシン語)を作成した上でそのコードをint型配列に格納しスタックのリターンアドレスを書き換え制御を移していくという高度な技が使われていた。
なんとずる賢い。