9

有人能解釋爲什麼DbContext.SaveChanges 10X在調試模式慢

  1. 爲什麼DbContext.SaveChanges運行〜10倍的調試模式不是生產模式慢?
  2. 有什麼辦法可以加快速度?

在調試模式下,如果我在沒有調試的情況下啓動項目,我的網頁需要116秒來加載而不是15秒。

我已經設置了跟蹤語句,並確定在調試模式下,我的DbContext.SaveChanges方法花費了116秒的〜100秒。

在沒有調試的情況下運行該項目只需花費7秒在同一節中。

讓我知道在評論,如果你想了解更多信息..

項目設置:

  • ASP.NET網頁
  • VS2012
  • SQLServer2012
  • 實體框架5.0

附加升資訊:(讓我知道在評論,如果你需要更多)

  • 在SaveChanges方法SQL查詢的累計數量爲20,000
  • 生產的連接字符串:數據源= PC-DEV;初始目錄= aspnet-2013-06-04; Integrated Security = True; MultipleActiveResultSets = True; Application Name = EntityFrameworkMUE
  • Debug Connection String:Data Source = PC-DEV; Initial Catalog = aspnet-2013-06-04; Integrated Security = True ; MultipleActiveResultSets = True; Application Name = EntityFrameworkMUE
  • 我也經歷過與LocalDB作爲後備數據庫相同的相對性能

更新:

由於@ruionwriting的建議,我分析的數據庫與什麼我發現是,〜20000個SQL命令採取恰好在調試或生產模式的項目是否運行同一時間。 (每個命令0毫秒)。

但是,在調試模式下,20,000個命令之間的平均絕對時間差爲5ms。

與生產模式相比,該組命令的平均時間差爲0.3 ms。

這是大約10倍的時間性能差異,並隔離了實體框架與在調試模式下花費額外時間的實體框架。

有沒有辦法配置調試版本,使EntityFramework可以被引用而不用調試標誌?

如果我想以某種方式通過某種編譯器魔法實現性能,那麼在調試功能方面會失去什麼?目前我無法進入實體框架代碼,所以我不認爲我會錯過任何東西。

謝謝!

+0

請問你的連接字符串的樣子,在調試時? – RealityDysfunction

+0

@RealityDysfunction在生產和調試模式下用字符串更新了問題。 – Jesse

+0

你有在VS中選中「啓用只是我的代碼」嗎?在調試菜單下 - >選項和設置 - >常規 - >啓用我的代碼。也許你有沒有選中,VS正在嘗試調試EF? – Tombala

回答

18

Whohoo!

好吧,所以調試模式異常緩慢的原因是因爲Visual Studio的Intellitrace記錄了實體框架生成的每個ADO.NET事件(都是20,000個)。

所以工具 - >選項 - > IntelliTrace和取消選中「啓用IntelliTrace」修復了這個問題。

或者你也可以只篩選出的ADO.NET事件通過轉到工具 - >選項 - >智能跟蹤 - >的IntelliTrace事件並取消ADO.NET

感謝大家的建議。

一節在這裏談論Will Intellitrace slow down my app

如何Filter IntelliTrace Events

+1

這僅適用於Visual Studio Ultimate。 – Vlad

相關問題