- - PR -
VS2005(C#) ボトルネックを効率良く見つけたい
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-10-27 11:52
パフォーマンスのボトルネックがはっきりしない場合、
例えば (1)各メソッドの実行に何ミリ秒かかったのか? (2)それは全実行時間の何パーセントに相当するのか? (3)各メソッドが何回呼び出されたのか? といった基礎データを実測することになります。 勿論メソッド単位では無く、より細かく、例えば分岐やループ単位でボトルネックを探さなければならない場合もあります。 スレッド同期を使う場合が多いので、ブレークポイントを細かく設定して、複数のケースをテストする機会が多いです。どしてもブレークポイントの点数が増えてしまいます。 ただ、アプリケーション構成としてはサーバー・クライアント等の分散環境では無くスタンドアロンなので、複数マシン間の負荷分散等の問題については私にとって主要な関心事ではありません。 現在は下記に示すように極めて原始的な方法で測定しています。 しかし、ブレークポイントの点数が増えるにしたがい、測定作業が煩雑になり困っています。 【現在の測定方法】 実行時間については、DateTime.Nowを直接ソースコードに挿入し、時間差の合計をテキストファイルに書き出しています。呼び出し回数についても同様の考えでカウンター変数を直接ソースコードに挿入しています。ブレークポイントの挿入場所が50カ所を超えると挿入位置の管理や結果の解析が非常に煩雑です。 // 実行時間の測定例 DateTime time001 = DateTime.Now; メソッド1 DateTime Time002 = DateTime.Now; メソッド2 DateTime Time003 = DateTime.Now; .... TimeSpan span001 = time002 - time001; TimeSpan span002 = time003 - time002; 質問1 ・上記の方法より賢い方法(工夫、知恵)はありますか? 質問2 ・VS2005(C#)に支援機能が標準あるいはオプションで用意されていますか? 質問3 サードパーティからどのような支援ツールが市販されていますか? 質問4 日本コンピュウェアのDevPartnerを使用しておられる方はいらっしゃいますか? C#用のパフォーマンス解析ツールの使用感をお聞かせいただければありがたいです。 http://www.compuware.co.jp/ 質問5 実行時間に加えて、各メソッドの重さ(CPUサイクルの消費量)を知る方法はありますか? ・マルチスレッドの場合、スレッドが一時的に休止していることがあるため、実行時間にだけ着目しても挙動を把握したとは言えないから。 ・CPUサイクル数という単位には特にこだわりせん。CPUに対する「重さ」を比較する客観的な目安を得ることが目的です。 | ||||||||||||
|
投稿日時: 2007-10-27 12:29
Stopwatch クラス (System.Diagnostics) http://msdn2.microsoft.com/ja-JP/library/system.diagnostics.stopwatch.aspx | ||||||||||||
|
投稿日時: 2007-10-27 12:43
そういうデータを取るためのツールとしてプロファイラを使用します。
VC++6.0の頃には標準の機能としてVisualStudioに組み込まれていたのですが(設定画面がバグってたけど)、いつのまにか居なくなりましたね。DownLoadCenterから別途ダウンロードすることはできるようですが。 VisualStudio2005 TeamSystemではプロファイラの機能を開発環境に再度統合されているようですね。
定期的に(あるいはランダムに)外部からプロセスをブレークさせて、その瞬間のコードポインタの位置を記録します。CPUサイクルの多いメソッドないにコードポインタがある確立が高いので、どのメソッドがCPU時間を多くつかっているのか、統計的にわかります。 _________________ 甕星 <mikahosi@abox9.so-net.ne.jp> http://blogs.msmvp.jp/mikahosi/ | ||||||||||||
|
投稿日時: 2007-10-27 17:24
こんにちは。
直接の回答ではありませんが…
数年前にも同じようなご質問をされているようですが http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=5639&forum=7&3 結局CLR Profiler (for the .NET Framework 2.0) じゃ、ダメ(使い方がわからない)だったのでしょうか? #私もちゃんと使ったことはないのですが。 (もしこのことに時間が費やせるなら)この辺を参考にプロファイラを自作してみるとかどうでしょう? デバッグとプロファイリングのインターフェイス (msdn2) Creating a Custom .NET Profiler (THE CODE PROJECT) これ↓を使うと良さそうですね。メソッドの呼び出し回数や時間を計測できそうです。 ICorProfilerInfo::SetEnterLeaveFunctionHooks
確かにVC++6.0のプロファイラの設定チェックボックスがバグっていましたね。 でもVC++6.0のプロファイラのおかげで劇的に速度改善できたことがあります。 | ||||||||||||
|
投稿日時: 2007-10-28 02:07
横から恐縮ですが・・・。
CLR Profilerはメモリの使用状況をプロファイルするツールなので、時間的な処理効率に関しては調査できないですね。 自分も今はStopwatchなどで処理時間を表示している程度なので、もし効率的にプロファイルできるツールがあればぜひ知りたいです。
もしよろしければなんというツールか教えていただけないでしょうか。 CLRにも使えるのでしょうか? | ||||||||||||
|
投稿日時: 2007-10-28 09:01
>質問1
>・上記の方法より賢い方法(工夫、知恵)はありますか? 私はlog4netを使用しています。 | ||||||||||||
|
投稿日時: 2007-10-29 10:08
>質問3
http://www.jetbrains.com/profiler/ ここのdotTrace Profilerを私は使っています。 全体の処理時間からメソッドごとの処理時間を%で 表示してくれるので明らかに時間がかかっているところを 見つけるのが簡単です。 まぁ〜プロファイラならそれくらい当たり前なんでしょうがw 同じところから発売されているReSharperっていうリファクタリング ツールを以前から使っていたので、その絡みでdotTrace Profilerを 使っているだけなんですけどね。 お試し版があるので、試しに使ってみては如何でしょうか。 | ||||||||||||
|
投稿日時: 2007-10-30 23:17
ご回答ありがとうございます。
Stopwatchクラスを知りませんでした。 実はCLR Profilerは使い方がよく分からなかったのです。 dotTrace Profilerは知りませんでした。 とりあえず試用版をダウンロードしてみようと思います。 |
1