■64ビットOSは速いのか?(2012/02/14)

 世の中はバレンタインデーだそうだが、そんなことは置いておいて。

 Windows7の普及とともに、64ビット版のWindows7を搭載したPCが各メーカから売り出されるようになっている。

 しかし、世の中のソフトにはネイティブな64ビットでビルドされた64ビット専用のソフトなど殆どなく、64ビット対応とか言って実際は32ビットモードで動作するような訳のわからないことになっている。

 Windows7も、64ビット版ではWOW64と言う技術を使い、64ビット版OSの上で32ビット版をエミュレートして動作させる機能があり、旧来の32ビットアプリケーションの動作を妨げないような工夫が凝らされている。

 更にそれでも不具合が出るアプリのためにXPモードなる仮想マシンも用意されており、MicrosoftのHPから無償でダウンロード/使用できるようになっている。(使用可能なホストOSはWindows7 Professional、Ultimate、Enterpriseで、Home版では使用できない)

 そこで、Windows7の64ビット版(=x64)が32ビット版が主流だったWindowsXPに対して、パフォーマンス的にメリットがあるのか無いのか、比較してみた。

 テスト用に準備したプログラムは、32000個のランダムな整数データをバブルソートで整列させるという単純なもの。 順次演算なのでシングルスレッドで動作させるプログラム、クイックソートのように再帰の可能なアルゴリズムで、再帰する度に新たなスレッドを起こせば、マルチコアのCPUではかなりなパフォーマンスも望めるかも知れないが、今回はCPUの性能を測る訳ではないのでバブルソートが合っているのではないかと思う。

 データは、32ビット整数、64ビット整数の2種類を準備し、プログラムも内部で32ビット整数の変数を扱うものと、64ビット整数の変数を扱うものの2種を用意した。
公正を期すために、プログラムの変更点は扱う整数に合わせたInt32,Int64の宣言のみを変更している、拠ってコンパイラは32ビット版ビルドの時にはInt64の宣言をLONGLONG構造体に変換するという処理をしていると思われる。

 結果は、以下のデータが示すように32ビットデータを扱うのなら32ビットOSのWindowsXPが64ビットOSのWindows7よりも20%程度速いという結果となった。
逆に64ビットデータを扱う場合にはWindowsXPでは25%も余分に処理時間が掛かると言うことになっている。

  32ビットデータ 64ビットデータ
Windows7pro sp1(x64) 1,586.797ms 1,696.691ms
WindowsXPpro sp3(x86) 1,302.499ms 2,117.374ms

縦軸は処理時間(ms)なので、短い方が速い

 これは、64ビットのデータを32ビットOSでは2個に分割して処理しているという点がパフォーマンスの低下に繋がるのだと思われる。 64ビットOSで32ビットデータの処理が遅くなるのは、32ビットのデータでも8バイト(64ビット)を使用する無駄遣いのオーバヘッドではないかと推測できる。

 では、64ビットOS上で動かす32ビットアプリと64ビットアプリではどんな差が出るのか、試してみた。

Windows7pro sp1(x64) 32ビットデータ 64ビットデータ
x64ビルド 1,586.797ms 1,696.691ms
x86ビルド 1,317.944ms 2,112.059ms

縦軸は処理時間(ms)なので、短い方が速い

 こちらでも、最も速いのはx86の32ビットデータとなっている、32ビットアプリに64ビットデータを扱わせるのはやはり苦しいらしく、60%も余計に時間が掛かる結果となった。

 総合すると、64ビットOSで64ビットデータを扱うアプリケーションなら、32ビット版より64ビット版の方が60%程度の処理速度の向上が見込めるが、32ビットデータを扱うアプリケーションなら32ビット版のアプリの方が若干速いと言うことらしい。

 32ビットデータ 符号付き整数では約±21億4748万、符号なしでは約42億9496万を表すことができる、個人資産はビル・ゲイツでもない限り扱えるが、市や県の年間予算は扱えそうにない。
太陽~土星の距離14.3億キロは扱えるが、太陽~海王星の45億キロは扱えない。

 64ビットデータ 符号付き整数では約±922京(兆の1万倍)、符号なしでは1845京を表すことができるので超大国の国家予算でも扱える、天体では97.4万光年まではキロ換算できる。(1光年は約9兆4600万キロ)