Windows


Windowsを64bit化するとPCが遅くなるのか?



32bitの時代も終わりを告げ、64bitの時代が始まった。

64bit版Windowsは、AMD64用に制作されている。
IA-32に比べてAMD64の良いところは、レジスタが64bitに拡張されている上、本数も8本から16本へと倍に増えていることだ。(もちろん他にもたくさんあるが)
扱うデータ量が大きくなり、アクセスできるメモリ領域が飛躍的に増えた。
レジスタ本数も多いので、それだけメモリを叩く回数も減り、理論上はものすごくPCが速くなるような気がする。

しかしその期待に反して、32bit版から64bit版に乗り換えても、それほど体感的に速くなったとは感じられない。
むしろPCの起動時間は長くなり、アプリケーションの起動や動作も気のせいかモタモタするようになったという人もいるかもしれない。

どうして現実が理論通りにならないのだろうか。

それは、PCの動作速度のほとんどがストレージ速度に依存しているためだ。
一般的にPCのストレージといえばハードディスク(HDD)だ。
PCはOSを起動するときもアプリケーションを起動するときも、プログラムコードとデータをHDDから読み込まなくてはならない。
実装しているメモリが足りないときは、HDDをメモリ代わりに使うこともある。(スワップという)
一般的にHDDのアクセス速度は、メモリに比べてとても遅い。
HDDからSSDなどのソリッドドライブに換装するといきなりPCが速くなるのは、HDDよりもSSDのほうがアクセス速度が速いためだ。
つまり、HDDへのアクセスが多ければ多いほどPCの動作速度は遅くなると考えていい。


32bitから64bitになると、プログラムコードもデータも大きくなる。
具体的には約2倍になる。
AMD64ISAはIA-32をもとに拡張されたISAなので、IA-32にREXプリフィックスが加わる程度で、一見倍にはなりそうに思えない。
しかし事実上PUSH・POP命令が廃止されてMOV命令に置き換わっているため、レジスタのメモリ退避・復元部分でかなりコードが膨れ上がる。
IA-32ではPUSHとPOPそれぞれ1バイトで出来ていたのが、AMD64の作法では同等のことをするのに「REXプリフィックス+MOV命令+modR/M+SIB+ディスプレースメント4バイト」の合計8バイトが必要になる。(ベースポインタにRSP以外のレジスタを使って退避させればSIBが不要になるため7バイトで可能なのだが、AMDがRSPを使うと決めたので仕方ない)
レジスタが16本になったとはいえ、メモリ退避が不要なほどの本数ではないため、コンパイルしたコードの中には多数のMOV命令が出来上がる。
さらに、レジスタにロードする即値やアドレス値など、コード中のオペランドサイズも2倍になっている。

変数や配列、構造体などのデータも64bit単位になるので約2倍になる。(32bit単位も使えるので組み方次第で必ずしもそうはならないが、WOW64は構造体を32bit→64bitに自動変換している)
ということは当然オブジェクトサイズも2倍に膨れ上がる計算になる。

単純計算で、メモリが2倍ないと32bit版よりも狭苦しくなるわけだ。
PCのスペックが同じなら、32bitOSと64bitOSでは、スワップが頻発する分64bitOSのほうが遅くなる。

では、メモリをたくさん積めば32bitよりも速くなるのか。
例えば4GBのメモリを積めば、32bit版の2GBと同等にOSの起動が速くなるのだろうか。
電源を入れて起動する際、PCはHDDからOSを読み込む。
このOSのサイズも32bit版の約2倍あるわけなので、メモリ容量が十分にあってもOSをHDDからメモリに読み込み終わるまでの時間も約2倍かかる計算になる。
つまり32bit版の約2倍、起動時間がかかるということになるわけだ。

HDDアクセス時以外の処理速度は32bit版よりもはるかに速いのだが、HDDが足を引っ張ってしまって期待したほど速くならないケースがあるわけだ。
しかし起動が終わりメモリが十分にあれば、あとの動作は32bit版よりも快適になることが多い。




[ 戻る ]