2010/06/20
「Cで書くコードの方がCommon Lispで書くより速いって人がいたら、それは彼のCの技量が高すぎるってことだね。」
Valvallowさんの『Lisp は「C 言語並みに速い」「C 言語より速い場合がある」』 を読んで、 故Eric Naggumの c.l.lへのポスト を思い出した。
一年以上前にCommon Lispで書いためっちゃCPUヘビーな関数を、 ものは試しと最適化してみたら、一回の呼び出し当たりダメダメな623µsから 快適な4.7µsに縮んだよ。
全く同等の機能を持つCの関数は呼び出しあたり92µsかかっていたんだけど、 みんなそこまで最適化して満足してたんだ。 Common LispだとCでやるよりもずっと素早く色々なアルゴリズムを試せるから、 Cでひとつ最適化を試してる間に全く別の方法やアプローチを試してみることが できる。こういうことはほんとに良くあるんだ。 つまり、Cプログラマが最適な実装を見つけ出すよりも速く、 良いCommon Lispプログラマは最適なアルゴリズムかつ最適な実装を見つけることが 出来るってこと。
Cで考える連中はCが速いって思ってる。 でもそれは、彼らがCommon Lispが遅いって思っている以上に真実からは遠いんだ。 本当に速いCコードを書くのはとてつもなく難しいんだぜ。 下手するとコンパイラの吐くコードを眺めて、 結局自分でアセンブリを書くハメになったりする。 俺もCPUから最後の血の一滴まで絞り出すようなコードを書いたことはあるけれど、 Allegro CLのインストラクションレベルプロファイラや ハック可能なLAP (ありがとう、Duane!)、それからコンパイラマクロによる コード変換 (これはCLの標準機能だ) を使わずにやるのは難しかっただろうな。 Cプログラマはこういう道具を持ってないんだよ。
それでもCで書くコードの方がCommon Lispで書くより速いって人がいたら、 それは彼のCの技量が高すぎるってことだね。
(DuaneはFranz Inc.のDuane Rettig。LAPはLisp Assembly Program。 まあインラインアセンブリみたいなもの。)
このポストは1999年のものだけれど、 マクロと低レベル機能の組み合わせで、色々がアルゴリズムが効果的に 試せるってのは今でも当てはまる。 ただ、今の時代だと、Allegro CLにも不満はあるなあ。 キャッシュミスの影響とか簡単に見られるようになってくれると有難いんだけどなあ。
Tags: Programming, Lisp
Post a comment