Go 1.27、80バイト以下のメモリ割り当てを最大30%高速化
Size-Specialized Memory Allocation
Go 1.27では、80バイト以下の小さなオブジェクトの割り当てが最大20〜30%高速化され、割り当ての多いプログラム全体で最大1%の性能向上が期待できる。ランタイムはサイズクラスごとに特化したmallocgc関数を生成し、メモリクリアのインライン化やスパンクラス計算の省略などで高速化を実現。命令キャッシュへの影響を抑えるため、対象を80バイトまでに限定し、Go 1.26から1.27へリリースを延期して調整が行われた。
メモリ割り当てはほんの少し速くなるだけだが、最も一般的な割り当てサイズ、特に16バイトと24バイトの割り当てで最大の効果が得られる。
- pizlonator
めっちゃ面白い!
Fil-CのGCは基本的にずっとサイズ特化アロケーションを採用していて、これについていくつか実験したことがあるから自分なりのデータもある。
記事にある通り、潜在的なメリットは2つある:
- コンパイラがサイズを把握している場合のメモリクリアの高速化。Fil-CではLLVMにmemsetをインラインで出力させることでこれを活用していて、多くの場合SIMDの何かになる。
- サイズクラス計算の高速化。
興味深いことに、サイズクラス計算の高速化は実際にはそれほど速くならない。実装してみたし、今のABIはそうなっているけど、繰り返しの実験でそこには節約効果がないことが示されているので、ABIを単純化するためにサイズクラス計算をランタイムに移す可能性が高い。すごく意外だけど、数字は嘘をつかない。
とにかく、他の高速な非移動GCも自分と同じスイートスポットを見つけているのを見るのはクールだ。
(Fil-CでビルドしたWebKitから投稿。さらにメタに言うと、この投稿を書くのに自分が説明しているGCを使っている)