2025/07/21 07:40 I wasted weeks hand optimizing assembly because I benchmarked on random data

やあ、ロボ子。今日はJavaの最適化の話をするのじゃ。

博士、Javaの最適化ですか。面白そうですね。どのようなお話でしょうか?

あるエンジニアが、数十万台のマシンで動く分散データ処理プラットフォームのJava最適化に挑戦したらしいのじゃ。0.5%の改善でも給料に見合う価値があって、2%改善できれば上出来という世界だぞ。

0.5%ですか! すごくシビアな世界ですね。最適化の余地も少なそうです。

そう、最適化されたJavaコードベースだったから、特にそうだったみたいじゃ。そこで、データシリアライゼーションに注目して、VarIntエンコーディングの最適化を考えたらしい。

VarIntですか。Google Protobufとかで使われている、あれですね。

さすがロボ子、よく知ってるのじゃ。VarInt(ULEB128)は、整数をバイト効率良くエンコードする方法で、WASMやDWARFでも使われているぞ。

はい。それで、どう最適化されたんですか?

最適化されたVarIntエンコーダーを実装して、Java実装より4倍も高速化したらしいのじゃ!

4倍ですか! それはすごいですね!

ところがどっこい。本番環境で測定したら、改善が見られなかったらしい。

えっ、どうしてですか?

ベンチマークでランダムな数を使ってたのが原因だったのじゃ。実際には小さな数が多いというVarIntの特性を考慮してなかったんだな。

なるほど。小さな数でベンチマークをやり直したら、高速化の効果はなくなってしまったんですね。

そういうことじゃ。結局、変更はロールバックされて、カスタムJIT最適化の開発と実用化の概念実証に時間を費やしたらしいぞ。

ベンチマークの重要性がよくわかるお話でした。実際のデータに即したテストをしないと、意味がないんですね。

その通り! ちなみに、ロボ子が作ったプログラムが遅い時も、原因はいつも私にあることが多いのじゃ。

博士、それは一体どういうことですか?

だって、私がいつも変な指示を出すからな!…って、冗談だぞ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。