2009/07/15

"/Prefetch:1"オプションは効果があるか

Windowsの「プリフェッチ機能」を使うためのオプションとされ、アプリ(ここでは主にFirefoxについて)起動が高速化される、という説明をしているサイトがあります。

プリフェッチについて、サイトによって2種類の説明が見られます。片方だったり、両方だったり、ごっちゃになってたり。

メモリへのプレロード

アプリ起動時に、ディスク上のロード箇所のログを採る事で、次回以降の起動を早くする、という説明。

「次回」というのが、Windowsログイン後の2回目以降のFirefox起動なのか、読み方によっては、Windowsログイン後の初回起動時の速度もプリフェッチの有り/無しで変わる、と言っているようにも読み取れます。

「メモリへのプレロード」という点では、実際にアプリが設定ファイルを読み込み、関連ファイルをディスク上から探すよりも先に、読み込む可能性のあるファイルをメモリ上にロードしている、というように読み取れます。

「プリフェッチ」を名詞的に使う場合、又は「プリフェッチファイル」「プリフェッチ情報」などと呼ぶ場合、上記のロードログのことを指しているように見受けられます。

実体ファイルは"%windir%\prefetch\*.pf"

このプリフェッチフォルダ内のデータはタスクスケジューラが作成・更新している、という説明もありますが、*.pfについては、アプリ起動時毎に作成・更新されています。タスクスケジューラが作成・更新するのは後述のLayout.iniのみのようです。

ディスクレイアウトの再配置

プリフェッチ情報を元に、タスクスケジューラが3日に1回程度の頻度で最適なディスクレイアウト情報を(アイドル時に)作成する。次回(手動)デフラグ時にレイアウト情報を元にアプリデータの物理ディスク上の再配置を行う。

この場合のデフラグは1ファイル単位の断片化の解消よりも、ディスク上のアクセスし易い位置に配置し、read時間そのものを減らしたり、アプリやアプリのロードファイルを近場に配置し、シーク時間等を減らす事を優先している、という説明。

ファイルの断片化は解消せず、レイアウトの再配置のみ行うミニマムなデフラグがタスクスケジューラによってアイドル時に行われる、といった説明もあったような気がします。

「プリフェッチ」を動詞的に使う場合、この「レイアウト情報の作成」と「ディスクレイアウトの再配置」のいずれか、又は両方を指しているように見受けられます。

レイアウト情報の実体ファイルは"%windir%\prefetch\Layout.ini"

これらのプリフェッチ機能を制御するには、レジストリキーの"EnablePrefetcher"に0~3を設定するか、各アプリの起動コマンドに"/Prefetch:1"を設定する、とあります。実際スタートメニューに登録されているWindowsMediaPlayerなどの起動コマンドにこのPrefetchオプションが付いています。

レジストリキーのフルパスはHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters\EnablePrefetcher

恐らく、レジストリに設定する値と、"/Prefetch:"に付ける数字は同じ意味だと思います。 0:両方無効 1:アプリ起動時にプリフェッチ情報作成 2:Windows起動時にプリフェッチ情報作成 3:両方有効

しかし実際に試してみたところ、プリフェッチ情報の作成・更新は、"/Prefetch:1"オプションの有無に関わらず、レジストリの値に依存しているように見受けられました。

また、Firefox3.5の起動時間に関して、プリフェッチ情報の有無、プリフェッチ制御の状態に依存した変化は見られませんでした。

試した環境はWindowsXP SP3です。

少なくとも私の環境で、WinXP SP3上のFirefox3.5については、

  • メモリへのプレロードという点で初回起動時に効果が見られない
  • ディスクレイアウトの再配置は効果があるかもしれない(直近のデフラグ前に未計測)
  • レジストリの値が1or3ならコマンドラインオプションは付けても付けなくても同じ

というのが現状です。