@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

VS2005(C#) ボトルネックを効率良く見つけたい

1
投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 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に対する「重さ」を比較する客観的な目安を得ることが目的です。
Tesla
常連さん
会議室デビュー日: 2007/03/13
投稿数: 30
投稿日時: 2007-10-27 12:29
引用:

質問1
・上記の方法より賢い方法(工夫、知恵)はありますか?


Stopwatch クラス (System.Diagnostics)
http://msdn2.microsoft.com/ja-JP/library/system.diagnostics.stopwatch.aspx
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2007-10-27 12:43
引用:

ひろしさんの書き込み (2007-10-27 11:52) より:
質問1
・上記の方法より賢い方法(工夫、知恵)はありますか?


そういうデータを取るためのツールとしてプロファイラを使用します。

引用:

質問2
・VS2005(C#)に支援機能が標準あるいはオプションで用意されていますか?


VC++6.0の頃には標準の機能としてVisualStudioに組み込まれていたのですが(設定画面がバグってたけど)、いつのまにか居なくなりましたね。DownLoadCenterから別途ダウンロードすることはできるようですが。

VisualStudio2005 TeamSystemではプロファイラの機能を開発環境に再度統合されているようですね。

引用:

質問5
実行時間に加えて、各メソッドの重さ(CPUサイクルの消費量)を知る方法はありますか?
・マルチスレッドの場合、スレッドが一時的に休止していることがあるため、実行時間にだけ着目しても挙動を把握したとは言えないから。
・CPUサイクル数という単位には特にこだわりせん。CPUに対する「重さ」を比較する客観的な目安を得ることが目的です。


定期的に(あるいはランダムに)外部からプロセスをブレークさせて、その瞬間のコードポインタの位置を記録します。CPUサイクルの多いメソッドないにコードポインタがある確立が高いので、どのメソッドがCPU時間を多くつかっているのか、統計的にわかります。

_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-10-27 17:24
こんにちは。

直接の回答ではありませんが…

引用:

ひろしさんの書き込み (2007-10-27 11:52) より:
パフォーマンスのボトルネックがはっきりしない場合、
例えば
(1)各メソッドの実行に何ミリ秒かかったのか?
(2)それは全実行時間の何パーセントに相当するのか?
(3)各メソッドが何回呼び出されたのか?
といった基礎データを実測することになります。



数年前にも同じようなご質問をされているようですが
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

引用:

甕星さんの書き込み (2007-10-27 12:43) より:
VC++6.0の頃には標準の機能としてVisualStudioに組み込まれていたのですが(設定画面がバグってたけど)、いつのまにか居なくなりましたね。DownLoadCenterから別途ダウンロードすることはできるようですが。


確かにVC++6.0のプロファイラの設定チェックボックスがバグっていましたね。
でもVC++6.0のプロファイラのおかげで劇的に速度改善できたことがあります。
焼きそば
会議室デビュー日: 2007/09/07
投稿数: 2
投稿日時: 2007-10-28 02:07
横から恐縮ですが・・・。

引用:

Tdnr_Symさんの書き込み (2007-10-27 17:24) より:

結局CLR Profiler (for the .NET Framework 2.0)
じゃ、ダメ(使い方がわからない)だったのでしょうか?
#私もちゃんと使ったことはないのですが。




CLR Profilerはメモリの使用状況をプロファイルするツールなので、時間的な処理効率に関しては調査できないですね。
自分も今はStopwatchなどで処理時間を表示している程度なので、もし効率的にプロファイルできるツールがあればぜひ知りたいです。

引用:

甕星さんの書き込み (2007-10-27 12:43) より:

VC++6.0の頃には標準の機能としてVisualStudioに組み込まれていたのですが(設定画面がバグってたけど)、いつのまにか居なくなりましたね。DownLoadCenterから別途ダウンロードすることはできるようですが。



もしよろしければなんというツールか教えていただけないでしょうか。
CLRにも使えるのでしょうか?
jama
常連さん
会議室デビュー日: 2006/09/12
投稿数: 45
投稿日時: 2007-10-28 09:01
>質問1
>・上記の方法より賢い方法(工夫、知恵)はありますか?
私はlog4netを使用しています。
常連さん
会議室デビュー日: 2004/10/27
投稿数: 21
投稿日時: 2007-10-29 10:08
>質問3
http://www.jetbrains.com/profiler/
ここのdotTrace Profilerを私は使っています。
全体の処理時間からメソッドごとの処理時間を%で
表示してくれるので明らかに時間がかかっているところを
見つけるのが簡単です。
まぁ〜プロファイラならそれくらい当たり前なんでしょうがw
同じところから発売されているReSharperっていうリファクタリング
ツールを以前から使っていたので、その絡みでdotTrace Profilerを
使っているだけなんですけどね。
お試し版があるので、試しに使ってみては如何でしょうか。
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2007-10-30 23:17
ご回答ありがとうございます。

Stopwatchクラスを知りませんでした。
実はCLR Profilerは使い方がよく分からなかったのです。

dotTrace Profilerは知りませんでした。
とりあえず試用版をダウンロードしてみようと思います。
1

スキルアップ/キャリアアップ(JOB@IT)