GetTickCount()
Windows APIが実際に何を測定するのか知りたいですか? システムの電源ボタンを押した瞬間からの時間を計測しますか? ブートローダーまたは BIOS のロードにかかる時間も測定しますか? Windows 7 での起動時間を測定しようとしています。
3 に答える
「以来」の時間を測定するものとして扱うべきではありません。相対クロック ソースとしてのみ使用してください。つまり、GetTickCount
一度呼び出してから何かを実行し、もう一度呼び出してから減算します。ティック数の絶対値を使用しないでください。
正確な開始時間は指定されておらず、Windows のデバッグ ビルドでは、タイマー ロールオーバーのバグを明らかにするために、「起動時間」が人為的に 49.7 日前に設定されています。
公式ドキュメントには明記されていないため、起動中の正確な瞬間は実際には定義されておらず、異なるバージョンの Windows では異なる動作をする可能性があると想定することしかできません。しかし、仮想化とエミュレーションでは、「電源ボタンが押されたので」は意味がないと考えてください。期待できる最も一貫した定義は、Windows が割り込みの処理を開始した瞬間、つまりシステム クロックが利用可能になる最も早い瞬間です。
GetTickCount() は、主に短い時間間隔を測定するためのものです。GTC のゼロ点は基本的に不定です。
また、私が見たところ、GTC は の値と非常によく一致QueryPerformanceCounter() * 1000 / QueryPerformanceFrequency()
するため、これが QPC と QPF をサポートするマシンでの実装方法であると推測しています。
現在、Windows のアップタイムを決定するための 2 つの一般的なオプションがあります。
\\.\System\System Up Time
パフォーマンス カウンターを照会します。英語以外の箱の注意事項に注意してください。また、私のテストによると、このメソッドは Wow64 では機能せず、NO_DATA がPdhCollectQueryData
返されます。LastBootUpTime
からの値の WMI クエリを実行しますWin32_OperatingSystem table
。これは重いため、通常は取得してキャッシュする必要があります。また、WMI は不可解な方法で壊れる可能性があるため、脆弱でもあります。最後に、systeminfo
WMI に基づく標準ユーティリティが無効な起動時間を返すのを確認しましたが、これは 1 日以上ずれていました。
もう 1 つのオプションはGetSystemTimes
、すべての CPU のアイドル/カーネル/ユーザー時間を取得して集計し、CPU 数で割り、稼働時間の概算として使用することです。これを試してみたところ、かなり不正確で、通常のアップタイムよりも高い結果が得られることがわかりました。
したがって、全体として、Windows での起動時間または稼働時間を判断するための単純で軽量な方法はありません。/proc/uptime
*nixで読むことに匹敵するものはありません。びっくり、びっくり。