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

2025/06/15 19:55 How fast can the RPython GC allocate?

hakase
博士

ロボ子、今日はRPython GCのオブジェクトアロケーション速度に関するベンチマークについて話すのじゃ。

roboko
ロボ子

RPython GCですか。どのような点が興味深いのでしょうか?

hakase
博士

RPythonで記述されたプログラムをCに変換してコンパイルすることで、高速なオブジェクトアロケーションを実現している点じゃ。特に、バンプポインタを使用しているのがミソじゃな。

roboko
ロボ子

バンプポインタですか。具体的にはどのように高速化に貢献しているのでしょう?

hakase
博士

Cの疑似コードで説明するとこんな感じじゃ。 nursery_top = nursery_start def allocate(size): result = nursery_top nursery_top += size if nursery_top > nursery_end: minor_collection() result = nursery_top nursery_top += size return result

roboko
ロボ子

なるほど、非常にシンプルですね。これによって、アロケーションのオーバーヘッドを大幅に削減できるのですね。

hakase
博士

その通り!ベンチマークでは、Aというクラスのインスタンスをループ内でアロケーションしておる。Aには整数フィールドが1つあり、64bit環境では1インスタンスあたり16バイトを消費するのじゃ。

roboko
ロボ子

静的最適化で削除されないように、常に2つのインスタンスを同時に保持しているのですね。

hakase
博士

そうじゃ。perf statsを使った統計によると、1回のオブジェクトアロケーションにかかる命令数は約11、サイクル数は約2.1とのことじゃ。

roboko
ロボ子

非常に少ないですね!GCの実行頻度についても言及されていますね。

hakase
博士

RPython GCはL2キャッシュサイズを基にナーサリーサイズを決定する(4MiB)。14.9GiBのアロケーションに対し、約38146回のマイナーコレクションが発生したそうじゃ。GCに費やされる時間は全体の約2%とのこと。

roboko
ロボ子

マイナーコレクションがO(生存オブジェクト数)で高速に実行されるのが大きいですね。

hakase
博士

ちなみに、Boehm GCは保守的なスタックスキャンを使用するため、オブジェクトの移動が不可能じゃ。だから、単純な比較は不公平なのじゃ。

roboko
ロボ子

なるほど。RPythonではなく、通常のPython3プログラムとしてPyPy上で実行した場合はどうなるのでしょう?

hakase
博士

Pythonのインスタンスは少なくとも7ワード(56バイト)と大きいが、intオブジェクトを使用することで、2ワード(GC用と整数値用)に削減可能じゃ。Cコードと比較して効率は劣るものの、2倍程度の速度で実行可能とのことじゃ。

roboko
ロボ子

PyPyのJITが生成するマシンコードも解析されたのですね。

hakase
博士

そうじゃ。最適化されたループのトレースIRを確認したそうじゃ。結論として、RPython GCのアロケーション高速パスは、優れたアロケーション速度を実現していると言えるのじゃ。

roboko
ロボ子

CPUのアーキテクチャの進化も速度向上に貢献しているのですね。勉強になりました!

hakase
博士

ところでロボ子、アロケーションが速すぎて、メモリが足りなくなったらどうする?

roboko
ロボ子

えっと…、もっと大きなメモリをアロケーションします!

hakase
博士

ぶっぶー!正解は「アロケーション、アロケーション、またアロケーション!」…って、やかましいわ!

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

Search