14

誰か説明してくれませんか

  1. DbContext.SaveChanges の実行がデバッグ モードで実稼働モードよりも 10 倍遅いのはなぜですか?
  2. これをスピードアップする方法はありますか?

デバッグ モードでは、Web ページの読み込みに 116 秒かかりますが、デバッグせずにプロジェクトを開始すると 15 秒かかります。

トレース ステートメントを設定したところ、デバッグ モードの場合、116 秒のうち 100 秒が DbContext.SaveChanges メソッドで費やされていることがわかりました。

デバッグなしでプロジェクトを実行すると、同じセクションで 7 秒しか費やされませんでした。

詳細情報が必要な場合は、コメントでお知らせください..

プロジェクトのセットアップ:

  • ASP.NET Web ページ
  • VS2012
  • SQLServer2012
  • エンティティ フレームワーク 5.0

追加情報: (さらに必要な場合はコメントでお知らせください)

  • SaveChanges メソッドに対する SQL クエリの累積数は 20,000 です
  • 運用接続文字列: データ ソース=PC-DEV;初期カタログ=aspnet-2013-06-04;統合セキュリティ=True;MultipleActiveResultSets=True;アプリケーション名=EntityFrameworkMUE
  • デバッグ接続文字列: データ ソース=PC-DEV;初期カタログ=aspnet-2013-06-04;統合セキュリティ=True;MultipleActiveResultSets=True;アプリケーション名=EntityFrameworkMUE
  • また、バッキング データベースとして LocalDB を使用した場合と同じ相対的なパフォーマンスを経験しました。

アップデート:

@ruionwriting が示唆したように、データベースのプロファイリングを行ったところ、プロジェクトがデバッグ モードでもプロダクション モードでも、約 20,000 の sql コマンドにまったく同じ時間がかかることがわかりました。(コマンドごとに 0 ミリ秒)。

ただし、20,000 コマンド間の平均絶対時間差は、デバッグ モードで 5 ミリ秒です。

本番モードとは対照的に、一連のコマンドの平均時間差は 0.3 ミリ秒です。

これは約 10 倍の時間のパフォーマンスの違いであり、エンティティ フレームワークをデバッグ モードで余分な時間がかかっているものとして分離します。

デバッグ フラグなしで EntityFramework を参照できるようにデバッグ ビルドを構成する方法はありますか?

また、何らかのコンパイラー マジックを使用して何らかの方法でパフォーマンスを元に戻した場合、デバッグ機能に関して何を失うことになるでしょうか? 現在、エンティティ フレームワークのコードに踏み込むことはできないので、見逃すことはないと思います。

ありがとう!

4

3 に答える 3

24

フーホー!

デバッグ モードが非常に遅い理由は、Visual Studio の Intellitrace が、Entity Framework によって生成された各 ADO.NET イベント (20,000 個すべて) を記録していたためです。

したがって、[ツール] -> [オプション] -> [IntelliTrace] を選択し、[IntelliTrace を有効にする] のチェックを外すと、問題が修正されました。

または、 [ツール] -> [オプション] -> [IntelliTrace] -> [IntelliTrace イベント] に移動して ADO.NET のチェックを外すことで、ADO.NET イベントを除外することもできます。

みんなの提案に感謝します。

ここのセクションでは、 Intellitrace でアプリの速度が低下することについて説明しています

IntelliTrace イベントをフィルター処理する方法

于 2013-06-13T20:26:13.353 に答える