ReadyBoost Monitor 公開 & 作り方

先日の VSUG Day 2006 Winter (id:NyaRuRu:20061127#p1) で使用した『ReadyBoost Monitor』をこっそり公開します.
面倒なのでソース・バイナリ,一式付けました.動作確認は Windows Vista RTM Ultimate Edition 日本語版.
(2008年1月28日追記)サスペンドからの終了時に例外が出力され終了してしまう問題を修正しました.
http://www.dwahan.net/nyaruru/hatena/ReadyBoostMonitor.zip
Windows Vista のデフォルト状態では,一般ユーザ権限でパフォーマンスカウンタが読めないので,管理者権限で実行するか,後述の方法でご使用のユーザを『Performance Monitor Users』グループ加えてください.
グラフの見方は以下の通り.

参考までに,セッション時にデモで用いた USB メモリは,Green House の『PICO TURBO 4GB』でした.

グリーンハウス 超高速転送!USB2.0フラッシュメモリ 4GB GH-UFD4GTB

グリーンハウス 超高速転送!USB2.0フラッシュメモリ 4GB GH-UFD4GTB


以下作成にあたってのポイント.といっても 30 分ぐらいで作ったので大したことはないですが.

どのパフォーマンスカウンタをモニタするか?

ReadyBoost を有効化すると,パフォーマンスカウンタに「Ready Boost キャッシュ」というカテゴリが追加されます.カウンタ一覧を眺めてみると,「Ready Boost キャッシュ - Total read byte/sec」と「Ready Boost キャッシュ - Hit read byte/sec」が分かれているところから,ReadyBoost は非同期に読み出しリクエストを行い,HDD からの読み出しよりも早く結果がかえってくればそれを使用するものと推測されます.また,ReadyBoost は書き込み時に圧縮+暗号化を行うので,読み出したパケット全てが使用できない場合の影響も含まれているのかもしれません.
何にせよ,せっかく USB メモリから読み出してもヒット率が低ければ意味がないので,そこを見るためにも両方モニタリングしてみましょう.
あとは比較対象で物理 HDD (C:ドライブ) の「read byte/sec」を並べて完成と.
「Ready Boost キャッシュ - Hit read byte/sec」が大きくて,同時に「PhysicalDisk - Disk Read Bytes/sec」が小さい状態が維持されるのが良さそうです.

.NET Framework からパフォーマンスカウンタにアクセス

System.Diagnostics.PerformanceCounter クラスを使用して,パフォーマンスカウンタにアクセス可能です.
以下注意点.
Vista RTM 日本語版では「Ready Boost キャッシュ」とカテゴリ名がローカライズされてしまっていますが,プログラミングの世界でここを訳すのは明らかに筋が悪いので,どこかで手違いがあったのではないかと思います.なんにせよ,この ReadyBoost Monitor は,「Ready Boost キャッシュ」とハードコードされたカテゴリ名を探しに行くため,英語版の Vista ではたぶん動きません.
USB メモリを挿していない状態だと,「Ready Boost キャッシュ」というカテゴリごと消えてなくなっているようです.
また,前述のとおり権限に注意.英語版の MSDN には既に注意喚起が追記されてます.

Note:
To read performance counters, you must have administrative privileges. In Windows Vista, User Account Control (UAC) determines the privileges of a user. If you are a member of the Built-in Administrators group, you are assigned two run-time access tokens: a standard user access token and an administrator access token. By default, you are in the standard user role. To execute the code that accesses performance counters, you must first elevate your privileges from standard user to administrator. You can do this when starting an application by right-clicking the application icon and indicating that you want to run as an administrator.

管理者権限で実行する以外に,『Performance Monitor Users』に追加してしまうというのも手です.

WPF の実装

かなり適当に作ったので,皆さんで改造してみてください.更新間隔 1 秒.Per Pixel Alpha 有効.常に最前面に表示.ドラッグアンドドロップで移動.フォーカス時にエスケープキーで終了,などなどが実装済みです.
絵心のない私としては,こういう作業は PowerGadgets の『Gauge Gadget』に任せる方が賢明なようです.早く来い来い PowerShell

Flip 3D 時の前面表示

今回作成した ReadyBoost Monitor は,Flip 3D 時にも最前面に表示され続けます.これを行うには,DwmSetWindowAttribute API で DWMWA_FLIP3D_POLICY と DWMFLIP3D_EXCLUDEABOVE を指定します.詳細はソースコードをどうぞ.