プログラムの性能を解析するには、プログラムの実行時間を測定する必要がある。リソースキットツールにはtimeit.exeという、アプリケーションの実行時間を測定するコマンドが用意されている。
対象OS:Windows XP/Windows Server 2003
プログラムのパフォーマンス(性能)を解析したり、システムの負荷などを調査したりするには、各プログラムが実行される時間を正確に測定する必要がある。
Windows OSでは、タスクマネージャを利用すればおおよその見当はつくが、プログラムごとの実行時間などの正確な情報は得られない。UNIXではこのような目的のためにtimeというツールがあり、プログラムの実行時間を測定するためによく使われている。
Windows OSの場合は、リソースキットツールに含まれるtimeit.exeコマンドが同等の機能を持っている。ただしこれはWindows XP/Windows Server 2003のリソースキットにのみ含まれており、Windows 2000のリソースキットでは利用できない。
なお、測定対象のプログラムが別のプログラムを起動するような場合は正確に測定できないことがあるので、注意して使っていただきたい。
リソースキットツールの入手方法や簡単な解説については、Tech TIPS「Windows OS向けリソースキットツールを入手する」を参照していただきたい。ツールのダウンロードページではWindows Server 2003用となっているが、実際にはWindows XP上でも利用できる。
リソースキットツールをインストールすると、timeit.exeというコマンドが利用できるようになる。このコマンドの使い方は、コマンドプロンプト上で「timeit -?」とすると表示されるし、リソースキットツールのReadme.htmファイル([スタート]メニューの[すべてのプログラム]−[Windows Resource Kit Tools]−[Windows Resource Kit Tools Read Me])中にも簡単な解説が用意されている。
timeit.exeの基本的な使い方は、パラメータに実行するプログラムのパス名を付けて起動するという方法である。
C:\>timeit notepad
パラメータとして指定するプログラムは、PATH環境変数の指す先に存在するプログラムの場合は、このようにプログラム名だけを記述すればよい。そうでない場合は、ドライブのルートからのフルパスを指定する。
C:\>timeit C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE
プログラムのパス名をダブルクォート記号(")で囲むと(なぜか)エラーになるので、この例のように、(たとえ空白記号などが含まれていても)囲まずにパスを指定すればよい。プログラムに対するパラメータが必要ならば、さらに後ろに続ける。
プログラムが起動すれば、あとは通常通りに作業を行ってから終了させる(このようなコマンドは、一般的には、GUIプログラムではなく、コマンドプロンプト上で動作するようなプログラムの性能解析に利用することが多い)。プログラムが終了すると、次のように実行したプログラムに関する統計値が表示される。
C:\>timeit C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE
Version Number: Windows NT 5.1 (Build 2600) ……OSバージョン
Exit Time: 11:38 am, Friday, May 7 2004 ……終了時間
Elapsed Time: 0:01:00.234 ……開始から終了までの経過時間
Process Time: 0:00:19.968 ……処理時間
System Calls: 902230 ……システムコールの回数
Context Switches: 36798 ……コンテキスト切り替えの回数
Page Faults: 84248 ……ページフォルトの回数
Bytes Read: 481545 ……ディスクからの読み出しバイト数
Bytes Written: 252408 ……ディスクへの書き込みバイト数
Bytes Other: 524120 ……その他のデータ転送バイト数
C:\>
いくつか数値が表示されているが、一番大事なのは「Elapsed Time」と「Process Time」である(ただしこのコマンドに関する詳細なドキュメントは用意されていないので、以下に述べる解説は一部推定を含む)。
「Elapsed Time(経過時間)」は、プログラムを起動してから終了するまでの実際の経過時間である。この例では約1分かかっていることが分かる。
「Process Time(処理時間)」は、プログラムの実際の処理時間である。つまり実際にCPUを占有して、動作していた時間の総計を表す。ただしシステムコール(OSのサービス)を呼び出している間の時間は含まないようである。そのため例えばシステムコールを呼び出しているばかりで、ユーザーモードではほとんど処理を行わないようなプログラムでは、このProcess Timeの時間は限りなく0に近づく。この値は、UNIXのtimeコマンドでいうと「user時間」として表示されている値に相当する(UNIXのtimeコマンドにおけるsys時間に相当する値は表示されない)。
これら2つの値を見ると、実際のCPU時間の消費具合や、システムの負荷状況を知ることができる。例えば上の例では、Elapsed Timeが約60秒、Process Timeが約20秒なので、CPUの使用率は平均すると20÷60=約33%ということになる。
ただしこれにはシステムコールの処理時間(呼び出し時間)は含まれていないので、実際のCPU使用率は、33%よりも高くなる可能性がある。そのため、これを利用する場合はタスクマネージャと併用するのがよいだろう。
タスクマネージャを使ったシステムの負荷状態の判断については、Tech TIPSの「カーネルモードとユーザーモードの負荷状況を簡単に見分ける方法」「負荷の大きいプロセスを特定する方法」も参照していただきたい。
「System Call(システムコール)」「Context Switches(コンテキスト切り替え)」「Page Faults(ページフォルト)」は、それぞれOSカーネルに関するパラメータであり、システムコールやコンテキスト切り替え、ページフォルトの回数を表す。最初の2つはあまり気にしなくてもよいが、ページフォルトの回数が多い場合は物理的なメモリ量が不足している可能性がある(ページフォルトは、メモリ不足のためにディスクにスワップアウトされてしまっているページ領域へアクセスしようとすると発生する)。
必要なメモリサイズの見積もり方については、Tech TIPSの「最適なページファイルサイズを知るには」「必要メモリサイズを見極める」も参考にしてほしい。
最後の3つの値(「Bytes Read」「Bytes Written」「Bytes Other」)は、それぞれファイルやディスクとの入出力が行われたバイト数を表しているようであるが、これはプログラムの処理内容によって大きく変わるので、あまり気にしなくてもよいだろう(「Bytes Read」の値はディスクキャッシュが有効に機能していると少なくなることがある)。
このtimeit.exeコマンドでは、実行した結果をログファイルに記録し、その平均値を計算して表示するという機能を持っている。
timeit.exeを実行すると、その結果が(デフォルトでは)カレントディレクトリにあるtimeit.datというファイルに記録される。そして何もパラメータを付けずにtimeit.exeを実行すると、現在timeit.datファイルに記録されているデータに基づいて、プログラムごとの平均値が表示される。
また、キー名を指定すれば、そのキーに属するデータだけを表示することもできる(「キー」とは実行したプログラムの名称のこと)。
C:\>timeit -k program1 ……指定したキーのデータだけを表示させる
Average for cmd key over 12 runs ……12回の実行における平均値
Version Number: Windows NT 5.1 (Build 2600)
Exit Time: 9:00 am, Monday, January 1 1601
Elapsed Time: 0:00:12.072 ……平均実行時間。以下すべて平均値
Process Time: 0:00:01.436
System Calls: 5316
Context Switches: 4759
Page Faults: 38357
Bytes Read: 144492271
Bytes Written: 78286947
Bytes Other: 19159
詳しくは「timeit -?」で表示されるヘルプメッセージを参照していただきたい。
■この記事と関連性の高い別の記事
Copyright© Digital Advantage Corp. All Rights Reserved.