C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: C#でデバッグ実行時の動作が遅いのを改善したい


(過去ログ 136 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■80339 / inTopicNo.1)  C#でデバッグ実行時の動作が遅いのを改善したい
  
□投稿者/ アブサン (10回)-(2016/07/08(Fri) 14:59:26)

分類:[C#] 

先日 VS2015 ProfessionalをWindows7 SP1のPCへインストールしました。

C#でWindowsアプリケーションを開発していますが、デバッグ時の
動作が異常に遅いです。

DBからデータを取得し、DataGridViewへ設定していますが
EXEを直接実行すると瞬時に返る処理がデバッグ実行時には3分程度かかります。

ちなみにデバッグ実行時にContextSwitchDeadlockのエラーが発生したため
例外設定からContextSwitchDeadlockをオフにしました。

また、「デバッグ中に診断ツールを有効にする」のチェックははずしています。

デバッグ実行の速度を改善したいのですが、VSの設定等を見直すべき箇所が
あればお教えください。

よろしくお願いいたします。
引用返信 編集キー/
■80341 / inTopicNo.2)  Re[1]: C#でデバッグ実行時の動作が遅いのを改善したい
□投稿者/ 魔界の仮面弁士 (760回)-(2016/07/08(Fri) 15:40:29)
No80339 (アブサン さん) に返信
> C#でWindowsアプリケーションを開発していますが、デバッグ時の

VS2008 まではそこそこ早いんですけれどね。
VS2010 からは開発環境が WPF 化されたせいか、もたつきがあるようで。


> デバッグ実行の速度を改善したいのですが、VSの設定等を見直すべき箇所が
> あればお教えください。

VS2005 以降では、プロジェクトのプロパティで、[デバッグ]タブの
[Visual Studio ホスティング プロセスを有効にする] を off にすると、
デバッグの開始および終了の時間が短縮されることがあります。
(その逆に、デバッグ時のパフォーマンスが落ちるケースもあるようですが)


また、UserControl や型付きDataSetなどを多数利用している場合、
フォームデザイナ起動時に、ツールボックスにそれらがロードされますが、
[ツール]-[オプション]から [Windows フォーム デザイナー]-[全般] を開き、
[ツールボックスの自動取得(または AutoToolboxPopulate)] を False にすると、
ツールボックスへの自動登録が行われなくなり、その分、デザイナの
初回起動の時間を短縮できます。
引用返信 編集キー/
■80344 / inTopicNo.3)  Re[2]: C#でデバッグ実行時の動作が遅いのを改善したい
□投稿者/ アブサン (11回)-(2016/07/08(Fri) 16:20:15)
No80341 (魔界の仮面弁士 さん) に返信

ご返信いただきありがとうございます。

デバッグの開始および終了はそれほど遅く感じられませんでしたが
[Visual Studio ホスティング プロセスを有効にする] のチェックを
はずしてみました。

「デバッグの開始および終了」と書かれているで当然かもしれませんが
やはり変わりはありませんでした。

言葉足らずで申し訳なかったのですが、開始および終了が遅いのでは
なくDataGridViewへの設定・表示が遅いようです。

実際は遅い画面にたどり着くまで下記操作をしています。

(1)ログインフォーム表示
(2)ログインでDBにアクセスして認証
(3)メインメニューフォーム表示
(4)メニューのボタン押下で該当の画面を表示
この画面でDBにアクセスして結果をDataGridViewへ設定してる

プログラムから出力しているログを見るとDBアクセスは1秒未満で
データの取得が終わっています。

よってDataGridViewへの設定・表示が遅いと考えています。

DataGridViewへはDataSourceプロパティへのバインドを使用して
おらず、セルのValueプロパティへ値を設定しています。

EXE直接だと早いので、プログラム的な要因とは思いたくないところ
ですが、、、

他に何か考えられることがあればアドバイスいただけると助かります。



引用返信 編集キー/
■80346 / inTopicNo.4)  Re[3]: C#でデバッグ実行時の動作が遅いのを改善したい
□投稿者/ とっちゃん (380回)-(2016/07/08(Fri) 17:24:41)
No80344 (アブサン さん) に返信
> EXE直接だと早いので、プログラム的な要因とは思いたくないところ
> ですが、、、
>
これは、デバッグ版を直接エクスプローラで実行した場合ですか?

であれば、出力になにかいっぱいトーレスが出ていませんか?

例えば、
Debug.WriteLine( "なんかいろいろトレース情報" );
などがあれば、このトレースログが時間をとっているため
意図せず遅くなっているということがあります。

出力ウィンドウを見てみるとわかるので一度チェックしてみてはどうでしょう?

引用返信 編集キー/
■80349 / inTopicNo.5)  Re[3]: C#でデバッグ実行時の動作が遅いのを改善したい
□投稿者/ 魔界の仮面弁士 (763回)-(2016/07/08(Fri) 17:46:21)
No80344 (アブサン さん) に返信
> EXE直接だと早いので、プログラム的な要因とは思いたくないところ
> ですが、、、

EXE から起動した後に、[デバッグ]-[プロセスにアタッチ] を利用して
デバッグした場合、同様の速度低下がみられますか?



> DataGridViewへはDataSourceプロパティへのバインドを使用して
> おらず、セルのValueプロパティへ値を設定しています。

あえてセル単位での制御を行っていると言うことは、
バインドでは扱いづらい内容を取り扱っているのでしょうか。


>>> EXEを直接実行すると瞬時に返る処理がデバッグ実行時には3分程度かかります。
> DataGridViewへの設定・表示が遅いと考えています。

設定完了までが遅いのか、
設定後の表示が遅いのかを調べてみてください。


また、表示させているデータ量は如何ほどなのでしょうか?

こちらでもダミーデータを用意して試してみたいので、
列数・行数その他特記事項など、新規プロジェクトにおける
再現調査に必要な情報を教えて頂けると幸いです。


ちなみに下記の場合、当方では開発環境の速度低下はみられず、
いずれも 1.15〜1.29秒程度で表示されました。

private const int ColumnCount = 255;
private const int RowCount = 2047;
private DataGridView dgv;
private Stopwatch sw;
protected override void OnDoubleClick(EventArgs e)
{
  base.OnDoubleClick(e);
  if (dgv == null)
  {
    sw = Stopwatch.StartNew();
    dgv = new DataGridView() { Dock = DockStyle.Fill };
    Controls.Add(dgv);
    dgv.AllowUserToAddRows = false;
    dgv.ColumnCount = ColumnCount;
    dgv.RowCount = RowCount;
    for (int r = 0; r < RowCount; r++)
    {
      for (int c = 0; c < ColumnCount; c++)
      {
        dgv[c, r].Value = $"{r+1}行{c+1}列";
      }
    }
    sw.Stop();
    Text = sw.Elapsed.ToString();
  }
}

引用返信 編集キー/
■80352 / inTopicNo.6)  Re[4]: C#でデバッグ実行時の動作が遅いのを改善したい
□投稿者/ アブサン (12回)-(2016/07/08(Fri) 19:01:09)
No80346 (とっちゃん さん) に返信

ご返信ありがとうございます。

> これは、デバッグ版を直接エクスプローラで実行した場合ですか?

EXE直接はデバッグ版を直接エクスプローラで実行しました。
.vshost.exeではなく.exeのほうです。

> であれば、出力になにかいっぱいトーレスが出ていませんか?
> 出力ウィンドウを見てみるとわかるので一度チェックしてみてはどうでしょう?

現状は自前で Debug.WriteLine していませんが、、、
たしかに出力ウィンドウに「例外がスローされました: 」がいっぱい出ています。。。

「'System.FormatException' (mscorlib.dll の中)」 や
「'System.NullReferenceException'」が大量に。

try〜catchとかしている箇所のものでしょうか?

一時的にでも出力ウィンドウへのメッセージは止めることができるものでしょうか。
ご存じでしたら設定をお教えいただけると助かります。

No80349 (魔界の仮面弁士 さん) に返信

ご返信ありがとうございます。

> EXE から起動した後に、[デバッグ]-[プロセスにアタッチ] を利用して
> デバッグした場合、同様の速度低下がみられますか?

はい。同様の速度低下となりました。

> あえてセル単位での制御を行っていると言うことは、
> バインドでは扱いづらい内容を取り扱っているのでしょうか。

はい。
SQLでは望んだ表形式に並べることが難しくプログラムで表へ入れ込んでいます。

> 設定完了までが遅いのか、
> 設定後の表示が遅いのかを調べてみてください。

設定完了までが遅いです。

> また、表示させているデータ量は如何ほどなのでしょうか?

セル数は23列×600行です。

内、3列は600行分、20文字以内の文字列が入ります。
残り20列は数字をカンマ付け等のフォーマットした文字列が入りますが
1/4程度も入っていないですので、3000セル未満です。

意味合い的には 6行で1つの 商品データ になっています。
横は製造工程を表しています。

数値は工程の入出庫数のようなもので、在庫数や率など一部プログラム
で単純計算を行った値を設定しています。

また、DataGridView_CellFormatting イベントを使用していますが
DataGridView_CellFormatting 内のプログラムをすべてコメントアウトしても
状況は変わりませんでした。

あと、数字のカンマ付けの処理はDataGridViewおよびDataGridViewTextBoxColumn、
DataGridViewTextBoxCellをカスタムしてカンマ付け可能にしたものを使用しています。
これらはVS2008で使用していたものでその際には特に問題は起きていませんでした。
後でカスタムから標準のDataGridViewに変更して動作確認してみます。

どうぞよろしくお願いいたします。

引用返信 編集キー/
■80353 / inTopicNo.7)  Re[5]: C#でデバッグ実行時の動作が遅いのを改善したい
□投稿者/ PANG2 (121回)-(2016/07/08(Fri) 19:19:21)
No80352 (アブサン さん) に返信

> たしかに出力ウィンドウに「例外がスローされました: 」がいっぱい出ています。。。
>
> 「'System.FormatException' (mscorlib.dll の中)」 や
> 「'System.NullReferenceException'」が大量に。
>
> try〜catchとかしている箇所のものでしょうか?
>
> 一時的にでも出力ウィンドウへのメッセージは止めることができるものでしょうか。
> ご存じでしたら設定をお教えいただけると助かります。

例外を握りつぶすのではなく、例外を発生させない対策が有効化かと。
引用返信 編集キー/
■80356 / inTopicNo.8)  Re[5]: C#でデバッグ実行時の動作が遅いのを改善したい
□投稿者/ とっちゃん (382回)-(2016/07/11(Mon) 10:17:55)
No80352 (アブサン さん) に返信
> 現状は自前で Debug.WriteLine していませんが、、、
> たしかに出力ウィンドウに「例外がスローされました: 」がいっぱい出ています。。。
>
> 「'System.FormatException' (mscorlib.dll の中)」 や
> 「'System.NullReferenceException'」が大量に。
>
> try〜catchとかしている箇所のものでしょうか?
>
> 一時的にでも出力ウィンドウへのメッセージは止めることができるものでしょうか。
> ご存じでしたら設定をお教えいただけると助かります。
>
例外発生時のトレースは消せません。

なので、PANG2さんが書いているように例外を発生させないような工夫が必要です。

この場合は、FormatException が出ないような、フォーマットテキストを選ぶ
NullReferenceException が出ないように事前に null チェックを行う。

というような対応で改善すると思いますよ。


引用返信 編集キー/
■80358 / inTopicNo.9)  Re[6]: C#でデバッグ実行時の動作が遅いのを改善したい
□投稿者/ アブサン (13回)-(2016/07/11(Mon) 11:46:08)
No80353 (PANG2 さん) に返信
No80346 (とっちゃん さん) に返信

ご返信いただきありがとうございます。

少々無理やりな感じで標準のDataGridViewに変えて
確認したところ問題ない速度となりました。

お二方がおっしゃるように例外を発生している箇所を
特定して見直してみます。

環境だと思っていたのでPGが原因だとは少々ショックで
半笑い状態です。

魔界の仮面弁士さんにも確認までしていただいて大変申し訳ないです。

また質問させていただく機会があると思いますが
こりずによろしくお願いします。

ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -