W.I.S. Laboratory
menu-bar

Windows


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

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

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

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

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

それは、PCの動作速度のほとんどがストレージ速度に依存しているためだ。
一般的にPCのストレージといえばハードディスク(HDD)だ。
PCはOSを起動するときもアプリケーションを起動するときも、プログラムコードとデータをHDDから読み込まなくてはならない。
実装しているメモリが足りないときは、HDDをメモリ代わりに使うこともある。(スワップという)
一般的にHDDのアクセス速度は、メモリに比べてとても遅い。
HDDからSSDなどのソリッドドライブに換装するといきなりPCが速くなるのは、HDDよりもSSDのほうがアクセス速度が速いためだ。
つまり、HDDへのアクセスが多ければ多いほどPCの動作速度は遅くなると考えていい。
なのでスワップがほぼ発生せず、大きな数の演算や頻繁な関数呼び出しが数多く行われるようなケースでは32bitOSよりも速くなっている。(はず)
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のほうが体感速度は遅くなる。
つまり今使っているWindowsが32bitであり、それを速くしようとしてWindowsを64bitのものに入れ替えても本末転倒になる可能性が高い。

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

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

体感速度で最も効果を感じられる改善策は、HDDをSSDに換装することだ。
SSDはHDDよりもアクセス速度が速いので、大抵の場合32bitOSをHDDで運用するよりも快適になる。
ただし32bitOSの時からSSDを使っているなら、64bit化するとSSDとはいえやはりスワップが増えるので32bitOSよりも遅くなる。

ちなみに64bit版Windowsで32bitのアプリを動かした場合、APIなど32bitコードの一部はエミュレーションで動作している。この際、32bitコードはリアルタイムに64bitコードに変換され、構造体なども64bitへ変換されるので、体感で感じられるほどの差はないものの理論的には32bit版Windows上で動かすよりも遅くなる。

以上を踏まえて「なぜ64bitOSが必要になってきたのか」を考えると、32bitではパソコンが遅いからということよりも、32bitではアドレスバスが足りないから(つまりリニアにアクセスできるメモリが4GBでは足りなくなってきたから)ではないかと思える。

ただしそれは32bit→64bit移行の過渡期を過ぎ、64bit演算が当たり前になった時代が訪れるまでの間の話だ。
32bitOS(32bitアーキテクチャ)上で64bit演算をするためには2回に分けて行う必要があり、さらにメモリも叩くことになるので数倍遅くなる。
その演算が何億回何十億回と行われることが当たり前の時代になれば、64bitOSのほうが数段速くなるだろう。
64bit版のRustやCrystalで「1」を型推論で代入した時のデフォルトビット数が32bitという時代はまだ続きそうなので、もう少し先のことになりそうな気はしているが。

[ 戻る ]
saluteweb