只では転ばない

DevQuizのスライドパズルは見事に玉砕した訳だが、その解答をC#で書くのには理由があった。
一つは暫く触っていなかった間にバージョンが上がってより複雑となったC#言語に慣れるためで、もう一つはVisual Studio 2010のプロファイリング機能を試して見たかったからだ。

私が使用しているVisual Studio 2010 Premiumというバージョンは本格的なプロファイラが付属しており、手軽にコードのプロファイリングができる。

プロファイリングの開始〜終了

使い方は簡単で、メニュー「分析」から「パフォーマンスウィザードの起動」を選択することで、対象のプロジェクトのどんな項目をプロファイルするかを選択できるので、それに沿って実行〜分析を開始するだけである。(勿論デバッグ同様に既に実行されているプロセスであってもデバッグ可能であればアタッチしてプロファイリングを開始/停止することもできる)

これでプロファイルが開始されるため、適宜アプリケーションが終了するのを待つか適当なタイミングで分析を終了することで解析が始まり、結果が表示される。(ヒープのプロファイルなどの大量データを分析する場合は非常に時間がかかる場合がある)

プロファイリング結果

ウィザードで「CPUサンプリング」を選択した場合は、プロファイリングの完了直後はこのような画面になる。これは時間軸でCPUがどれだけアプリケーションで消費されたかのグラフと、その下に負荷がもっとも高かった(CPU時間を消費した)メソッドのパスである"ホットパス"が階層で表示される。(従来"ホットスポット"と呼んでいたものと同じ意味だ)

ホットパスが解るとアプリケーションのどの部分がパフォーマンスに影響されているかが明確になる。(80:20の法則等を適用する)

ここで分析の対象としたいメソッドをマウスで選択することで、ホットパスとなっているメソッドの詳細にドリルダウンすることができる。

ドリルダウンした詳細画面は上下二つのペインに分かれており、上のペインではどのようにメソッドが呼ばれたのスタックがグラフィカルに(消費したCPU時間が多いもの程大きく、色が濃く)描かれている。

ここでのメソッドを選択することでメソッドパスのスタックを上がったり下がったりすることができる(追うことができるのはソースコードがある所までだ)

下側のペインは上部ペインで選択されたメソッドに対応する実際のソースコードが表示される。

この段階でどのメソッドでCPU時間を消費しているのかが明確になる訳だ。

私も実際にこのプロファイラを使用してボトルネックはどこかを調べたり、Out of Memoryが発生した際の原因を調べるのに使用したが、開発環境に最初から組込まれていることもありオーパヘッドも低く快適に使用できた。

最後に、こんなリッチなプロファイラを使ってもパズルの回答数を増やすことができなかったのはプロファイラのせいではなく、単に私の能力が不足していただけだということを断わっておこう。


※Debug.WriteLineがホットパスとして選択されているが、これはデバッグモードで実行させたためである。当たり前のことだが、コンソールへのデバッグ出力は非常に負荷が高いため、実際のプロファイル時には対象からは除外する。