2025/09/23(火)64bit バイナリは footprint の大きさを実行効率で覆せるのか
基本的に64bit バイナリはプロセスイメージが大きい(必要メモリ容量が大きい)。
64bit版が不利な点
- キャッシュに収まりにくい
- CPUの並列化は進んでいるが周波数は伸び悩んでいる。プログラムの動作スピードに影響が大きいのがキャッシュにヒットするかどうかである。その点、プロセスイメージの大きいバイナリはキャッシュ的に不利である。
32bit版が不利な点
- Windows API が WOW64
- Windows x86_64 版では 32bit プログラムは WOW64 というエミュ層で動くらしいので、これがネイティブ64bit版APIを経由するような構成の場合は、APIコールの数がスピードに響いてくる。
- 汎用レジスタが少ない
- 64bitバイナリは 16個の汎用レジスタを使えるが、32bit版は4~6個くらい。関数コール等のABIでレジスタ渡しが難しいのも影響ありそう
32bit と 64bit 両方のバイナリがある場合に、大きいメモリを扱わないケースで 64bit 版のほうが速くなることがあるのだろうか。
思考実験としては
- 大きいメモリを使わない→キャッシュにヒットしやすい→64bit版でもOK
- 大きいメモリを使う→キャッシュにヒットしにくい→どちらの版でも遅いがポインタ的には64ビットのほうが良い
メモリ使用量の例
図は例として Tera Term の 32bit 版と 64bit 版のメモリマップである。どちらともプログラム起動直後の状態。
Image(Text) も Heap も64bit版がずっと大きい。
CPUのキャッシュ(L1/L2/L3)に収める必要がある領域が大きくなる。

