昨晩、同僚が.NET アプリケーションの処理速度パフォーマンスチューニングで苦労していた。まずは、コード上のどこがボトルネックになっているかを探さなくてはいけないわけだが、はたと、(今は休刊になってしまった)Windows デベロッパーマガジンに、.NET アプリケーション用のプロファイラ、
"NProf" が紹介されていたなぁ、と思い出した。
(プロファイラとは?:
http://www.sophia-it.com/content/%E3%83%97%E3%83%AD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%A9)
とりあえずどんなものかと Google で "NProf" をキーワードに検索してみたが、特に解説を載せてくれているようなサイトは見つけることができなかった(あまり深追いもしないでざっくり眺めただけだが)。
まぁそれはいいやと、NProf の ホームページを訪ねてみる。
http://www.mertner.com/confluence/display/NProf/Home
どういう風に使うのだろうかと、"Documentation" のページを開いてみたが、アーキテクチャ概要や、API の項があるものの、プロファイルの仕方については読み取れなかった。
いまひとつ、使い方のイメージが掴めず、ちょっと不安に駆られる。何か特別なアセンブリとリンクする必要があるのだろうか、コンパイル時になにかオプション指定が必要なのか、etc。
悩んだところで始まらないので、インストールパッケージをダウンロードしてインストールする。
最新版は ver.0.10 で 昨年 2006 年の10月に更新、Alpha リリースという位置づけだそうだ。
スタートメニューに NProf が登録されるので、起動してみる。
割とシンプルなユーザーインターフェースだ。いくつかメニューを開いてみたりした感じで、何となく使い方が想像できた。
まずは、Application の欄に、プロファイル対象のアプリケーションファイル(.exe)のパスを指定する。必要とあれば Arguments の欄にコマンドライン引数を追加。
あとは [F5] を押すと、Application の欄に指定したアプリケーションが起動する。
起動したら、ひととおりそのアプリケーションを動かしてみてから(すでにこの間、プロファイル情報が着々と収集されている)、そのアプリケーションを終了させる。
すると NProf がプロファイルの結果を収集して、ウィンドウ内に表示してくれる。
図は、Microsoft SQL Server Management Studio Express をプロファイルしてみた NProf の画面。Management Studio を終了させてから、プロファイル結果が表示するまでに結構待たされるので最初不安になったが、どうやらプロファイル結果の収集に時間がかかっていたらしく、待っていたらちゃんと表示された。
全体の処理時間を 100 として、各メソッド呼び出しについて何%を消費したのかをツリービュー形式で表示してくれるようだ。上の行ほど時間をより多く消費しているメソッドらしい。
"Callees" のツリービューは呼び出し元から呼び出し先へたぐれるツリーで、"Callers" のほうは呼び出されている側から呼び出し元へたどれるツリーらしい。
System ネームスペースのアセンブリに対する呼び出しなどもすべてプロファイル対象なので一見すると面食らってしまうが、Ctrl+F で検索ができるので、ここで自分が作成したクラス名やネームスペースで検索をかければ大丈夫。
これだけだ。
意外と簡単に使えた。何かソースコードに手を加える必要もない。
プロファイルの対象はメソッド呼び出しの単位で、ソースコード中の行単位ではない。このあたりは、Visual Studio Team Edition などの有償製品は流石に格が違う。
しかし、さっさとボトルネックを探すにはメソッド呼び出しの単位でも十分。
とにかくオープンソース(*1)でお手軽に使えるのは歓迎すべきことだ。
*1... NProf のライセンスは GPL とのこと。