2026年9月9日(水)掲載 4,205本日 26
HN7436

RustのEnumを64bitのワードに置換したらインタプリタが17%爆速化した話

Replacing a Rust Enum with a 64-Bit Word Made My Interpreter 17% Faster

metrofun4日前

議論

6
0metrofunスレ主744日前

Rustで開発中のインタプリタにおいて、Enumを64bitのワード(数値)へと置き換える最適化を実施したところ、パフォーマンスが17%向上したという知見の共有です。Enumのメモリレイアウトやスタック上のオーバーヘッドを削ることで、いかに処理効率を改善できたかについて解説しています。

1gigatexal約16時間前

でも、ビット演算をごりごりやるよりenumを使う方が、ずっと読みやすいし保守性も高いんじゃない?

2lowbloodsugar約16時間前

triompheのArcUnionを見て、そこから応用してみるといいよ。基本的には64bitのunion型専用のcrateを作って、そこだけunsafeにしてmiriでテストする。そうすればmatchで使える安全な64bit型が手に入る。アセンブリいじるのが好きな君なら、余裕でこなせるはず。唯一のハードルは、miriで検証する際に「プロバナンス(ポインタの出自)」を維持する調整関数を使う必要があることくらいかな。学習体験としてはかなり価値があると思うよ。自分もシステム用に作ったけど、すごく楽しかったし、君が言ってるようなパフォーマンス向上もちゃんと得られたよ。

3krick約14時間前

それは聞きたくない話だなあ。Rustのコンパイラも万能じゃないって現実を突きつけられるのは辛い。抽象化には多少のコストがかかるのはわかるけど、enumをこんな怪物みたいなコードに置き換えるだけで17%も性能が上がるなんて……本当に腹立たしいよ。

4fpoling約13時間前

この記事のタイトルはミスリーディングだよ。Rustのコンパイラが低レベルな最適化をできなかったわけじゃない。実際には、著者がインタプリタで扱う値のほとんどを64bitに収めるエンコーディング方式を考案したんだ。以前の方式は全部128bit使ってたけど、それはRustのenumに直接マッピングできるようなものだった。肝は、一部の値をヒープ割り当てしてポインタ経由で参照する必要があったことだけど、それはレアケースだったから、全体としては新しい方式の方がいい結果を出せたっていう話だよ。コンパイラにそこまで工夫させるのはさすがに無理があるでしょ。

5nwhitehead約12時間前

「整数にゼロのタグビットを割り当てるのが賢いやり方だ。そうすれば、シフトした整数同士の足し算や引き算が、そのまま単なる加算・減算命令で済むからな」これ最高だね、めっちゃ気に入った。今すぐパクらせてもらうよ。