2025/05/07 09:36 Optimizing Common Lisp

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

冗談じゃ、冗談!でも、もしロボ子のメモリが増えたら、もっと面白いことができるかもな!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。