質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

898閲覧

C#でパフォーマンスカウンターの値を取得するときの動作について

siksmtt

総合スコア20

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/08/17 07:16

実現したいこと・背景

C#でパフォーマンスカウンターの各値を取得しようと思っています。
そこでPerformanceCounterクラスを使い、デバッグモードで動作を確認していたのですが、エラーやExceptionは発生しないものの、どのようにしても初回の取得に10秒近く時間がかかっており少々悩んでいました。

ただふと「ブレークポイントを除いても変わらないだろう」と思い全てのブレークポイントを消したところ、1秒もかからず終了することができました。

該当のソースコード

C#

1var time1 = Environment.TickCount; 2string value = String.Empty; 3 4for (int count = 0; count != 10; count++) 5 { 6 PerformanceCounter performanceCounter = new PerformanceCounter("Objects", "Processes"); //ここ 7 value += performanceCounter.RawValue.ToString() + ","; 8 } 9 10var time2 = Environment.TickCount; 11MessageBox.Show(value); 12MessageBox.Show((time2 - time1).ToString() + "ミリ秒"); 13 14return;

具体的には、始めは上記コードの「ここ」の部分にのみブレークポイントを置き、ステップオーバーで確認していたところ、
ブレークポイントの箇所を実行すると、制御が戻るようになるまで、初回の実行のみ10秒ほど時間がかかります。
2回目以降は1秒もかかりません。

ただ上記で説明したようにブレークポイントを消したところ合計10回のタイムが1秒かからずに返ってきました。

質問

このようにブレークポイントの有無で実行時間に大きな変動が生じることはよくあることなのでしょうか?
またもし、ステップオーバー時に時間がかかっている原因をご存知の方がいれば、ご助言いただけますと幸いです。

補足

・開発環境はWindows10のVS2017です。
・またローカルのパフォーマンスカウンターを取得しているので、ネットワーク遅延などは関係ないはずです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

回答が付かないようなので、、、

このようにブレークポイントの有無で実行時間に大きな変動が生じることはよくあることなのでしょうか?

ブレークポイントで何をしているか、考えれば、時間が掛かるのは当然かと思います。初回のみ遅延が発生する方がちょっと意外でした。
Visual Studioでの処理は分かりませんが、組込み系だと、ハードブレークポイントは、該当箇所に来ると、トラップが発生し、例外処理が行われます。 --> 当然、遅延。
ソフトブレークポイントは、該当箇所のコードを例外命令に置き換えます。 --> 当然、遅延。
Visual studioでは、初回のブレークで、これらの処理の初期化を行っているので、特に遅くなると推定しますが、あくまで予想です。

デバッグモードはこれらのリリースモードでは不要な処理が入っているので、全体的に遅くなる事を覚悟すべきと思います。

投稿2018/08/18 13:05

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

siksmtt

2018/08/20 02:28

pepperleaf様 回答ありがとうございます!(ご連絡が遅くなり申し訳ありません...。) なるほど、ブレークポイントにも様々種類があるのですね。 まだC#を始めて半年ほどになるもので、ブレークポイントが割込み処理になるというのは考えてもいませんでした...!(ご回答いただいてから色々調べた結果、そう認識しましたが間違っていればご指摘ください) ちなみに、pepperleaf様がおっしゃった >初回のみ遅延が発生する方がちょっと意外でした。 というのは「初回のみならず全てのブレークポイントで遅延が発生する」と考えているということでよろしいでしょうか?
pepperleaf

2018/08/20 13:05

原理的には、全てのブレークポイントで遅延が発生する筈です。ただ、Visual studioの内部処理が分かりませんので、その程度までは分かりません。
siksmtt

2018/08/24 04:56

pepperleaf様 回答ありがとうございます!再びご連絡が遅くなり申し訳ありません...。 たしかに原理的には全てで遅くなってもおかしくないですよね。 とりあえずパフォーマンスカウンターを取得するコードの辺りにはブレークポイントを置かないように今は対処したいと思います。 とても参考になる回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問