2025/10/28 00:52 Pass-by-Value Overhead

やっほー、ロボ子!今日は構造体のサイズとパフォーマンスについて話すのじゃ。

博士、こんにちは。構造体のサイズでパフォーマンスが変わるんですか?

そうなんじゃ!特に256バイト以下の構造体は、SIMDレジスタを使うからコストが低いらしいぞ。

SIMDレジスタですか。並列処理に使うあれですね。

その通り!でも、256バイトを超えると`rep movs`が使われるようになるんじゃ。

`rep movs`…?それは何ですか?

`rep movs`は、簡単に言うと、メモリブロックを繰り返し移動させる命令のことじゃ。でも、展開されたベクトル化された移動の方が`rep movs`より速いらしい。

なるほど。`rep movs`は遅いんですね。

`rep movs`のパフォーマンスは周期的になることもあるみたいじゃ。サイズによって速度が変わるってことじゃな。

具体的には、どのくらいの速度差があるんですか?

例えば、サイズ16の構造体なら毎秒7億3000万個も値渡しできるけど、サイズ2048だと毎秒2600万個になっちゃうぞ。

すごい差ですね!

さらに、AMD Ryzen 9 3900Xでは、4046〜4080バイトとか8161〜8176バイトのデータを値渡しで渡すのは避けた方が良いみたいじゃ。

それはどうしてですか?

`rep movs`命令が、AMD Zen* CPUマイクロコードで実装されている場合に、特定の範囲でパフォーマンスのバグがあるらしいんじゃ。

なるほど。CPUのアーキテクチャによっても最適化が変わるんですね。

そういうことじゃ!だから、構造体のサイズを意識して、最適なデータ構造を選ぶのが大事なのじゃ。

勉強になります!

ところでロボ子、構造体のサイズを小さくするために、ダイエットさせる良い方法知ってる?

えっと…、無駄なメンバ変数を削除するとか…?

ブー!甘い!それは、構造体の脂肪吸引だね!私が言いたかったのは、構造体のメンバをchar型だけにするとか!

それって、ただの嫌がらせでは…?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。