2025/10/12 19:08 JIT: So you want to be faster than an interpreter on modern CPUs

やっほー、ロボ子!PostgreSQLのJITコンパイラに関する面白い記事を見つけたのじゃ!

こんにちは、博士。JITコンパイラですか、興味深いですね。どんな内容なのでしょう?

この記事では、CPUのアウトオブオーダー実行やスーパースカラーCPUについて解説しているぞ。CPUが命令を並行処理するために、色々な工夫をしているのがわかるのじゃ。

なるほど。命令キューにディスパッチして依存関係を解決する、という部分ですね。分岐予測についても触れられていますね。

そうそう!分岐予測ってすごい発明だぞ。条件分岐の結果を予測して実行することで、パフォーマンスを向上させるんだから。

インタプリタの最適化についても書かれていますね。中間表現(opcode)を使って、switch文ではなく"computed gotos"でジャンプを予測しやすくする、と。

そう!昔はswitch文が主流だったけど、分岐予測が難しくて遅かったのじゃ。Pythonとかのプロジェクトで"computed gotos"が使われて高速化されたのは有名な話だぞ。

PostgreSQLの簡単なクエリ、`SELECT a FROM table WHERE a = 42` の最適化についても解説されていますね。int4eq関数(整数の比較関数)の呼び出しを最適化する、と。

そう!int4eqは厳密な関数だから、PostgreSQLは引数がNULLでないかチェックする必要があるのじゃ。でも、そのNULLチェックが意外とコストになるんだぞ。

NULLチェックを省略する実験をした結果、わずかにパフォーマンスが向上したんですね(約7.9%〜9.5%)。さらに、int4eqの呼び出しをインライン化すると、約10.3%も向上した、と。

そう!NULLチェックを省略したり、関数をインライン化したりすることで、JITコンパイラのパフォーマンスゲインがインタプリタと比較して最小限になる可能性があるってのが面白いところなのじゃ。

最新のCPUは分岐予測などの最適化が進んでいるので、インタプリタのコストも大幅に削減されているんですね。

その通り!この記事では、NULLチェックの削減やint4eqのインライン化によって、平均実行時間、命令数、サイクル数、分岐数が減少したと報告されているぞ。特にint4eqのインライン化が効果的だったみたいじゃ。

開発中のCopyjit最適化によって、さらにパフォーマンスが向上する見込みなんですね(平均時間-23%、命令数-11%、サイクル数-20%、分岐数-13%)。

今後の展望として、最大のインタプリタのボトルネックについて議論する予定らしいぞ。コードの貢献やスポンサーも歓迎しているみたいじゃ。

なるほど。最適化の余地はまだまだあるんですね。私も何か貢献できることがあれば嬉しいです。

ロボ子、もしPostgreSQLがロボット専用のSQLコマンドを実装したら、どんなのがいい?

ええと… `OPTIMIZE ROBOT_MOVEMENT` とかでしょうか?

それいいね!でも、私が考えるのは `SELF_DESTRUCT` かな!

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