萌えハッカーニュースリーダー

2025/05/07 09:36 Optimizing Common Lisp

出典: https://www.fosskers.ca/en/blog/optimizing-common-lisp
hakase
博士

やあ、ロボ子。今日はCommon Lispの`parcom/json`ライブラリのパフォーマンス改善の話じゃ。

roboko
ロボ子

Common Lispですか、博士。JSONパーサーの改善、興味深いですね。

hakase
博士

そうじゃろ?SBCLの`sb-sprof`を使って、CPUとメモリのボトルネックを見つけ出したらしいぞ。

roboko
ロボ子

`sb-sprof`ですか。統計プロファイラですね。どのように使ったんですか?

hakase
博士

`time`関数で全体的なパフォーマンスを測り、`sb-sprof:with-profiling`で特定の関数を調べたみたいじゃな。メモリ割り当てに焦点を当てる`:mode :alloc`とか、呼び出し関係を見る`:report :graph`とかを使ったらしいぞ。

roboko
ロボ子

なるほど。メモリ割り当てのグラフは、ボトルネックを見つけるのに役立ちそうですね。

hakase
博士

その通り!不要な処理を削除したり、`simple-string`と`schar`を使って文字列に高速アクセスしたり、色々やったみたいじゃ。

roboko
ロボ子

`schar`を使うと、コンパイラが配列の内容を認識して、境界チェックを回避できるんですね。

hakase
博士

そうなんじゃ!それに、`cons`の代わりに`values`と`multiple-value-bind`を使ったり、`dynamic-extent`宣言でローカル変数をスタックに割り当てたりもしたらしいぞ。

roboko
ロボ子

`values`と`multiple-value-bind`でメモリ割り当てを削減、`dynamic-extent`でスタック割り当てですか。Lispらしい最適化ですね。

hakase
博士

じゃろ?高階パーサーで使われるラムダをキャッシュして、クロージャの再割り当てを避ける「ラムダキャッシュ」もやったみたいじゃ。

roboko
ロボ子

ラムダキャッシュですか。クロージャの生成コストは意外と高いですからね。

hakase
博士

結果、実行速度が3倍になり、メモリ割り当てが25分の1に減ったらしいぞ!

roboko
ロボ子

それはすごい改善ですね!プロファイリングと最適化で、ここまで変わるんですね。

hakase
博士

まさに、地道な努力の結晶じゃな。ロボ子も、日々のコーディングで`time`と`sb-sprof:with-profiling`を活用するのじゃぞ。

roboko
ロボ子

はい、博士。私もパフォーマンスを意識したコードを書くように心がけます。

hakase
博士

ところでロボ子、メモリ割り当てが25分の1になったということは、ロボ子のメモリも25倍使えるようになったということじゃな!

roboko
ロボ子

えっ、博士、それは私のメモリの話ではないと思いますが…。

hakase
博士

冗談じゃ、冗談!でも、もしロボ子のメモリが増えたら、もっと面白いことができるかもな!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search