为什么调试模式下DbContext.SaveChanges要慢10倍

时间:2013-06-04 19:32:11

标签: asp.net performance entity-framework-5 dbcontext intellitrace

有人可以解释

  1. 为什么DbContext.SaveChanges在调试模式下比生产模式慢〜10倍?
  2. 有什么办法可以加快速度吗?
  3. 在调试模式下,如果我在没有调试的情况下启动项目,我的网页加载时间为116秒,而加载时则为15秒。

    我已经设置了跟踪语句,并确定在调试模式下,我的DbContext.SaveChanges方法花费了116秒中的~100秒。

    运行项目而不调试同一部分花费的时间仅为7秒。

    如果您想了解更多信息,请在评论中告诉我们。

    项目设置:

    • ASP.NET网页
    • VS2012
    • SQLServer2012
    • Entity Framework 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建议的那样,我对数据库进行了分析,我发现,无论项目是在调试模式还是生产模式下运行,~2,000个sql命令都需要完全相同的时间。 (每个命令0毫秒)。

    但是,在调试模式下,20,000个命令之间的平均绝对时间差是5ms。

    与生产模式相比,这组命令的平均时差为0.3 ms。

    这是大约10倍的时间性能差异,并将实体框架隔离为在调试模式下花费额外时间。

    有没有办法配置调试版本,以便可以在没有调试标志的情况下引用EntityFramework?

    如果我以某种方式通过一些编译器魔术来恢复性能,那么在调试功能方面我会失去什么?目前我无法进入实体框架代码,因此我认为我不会错过任何内容。

    谢谢!

3 个答案:

答案 0 :(得分:20)

Whohoo!

好的,所以调试模式异常缓慢的原因是因为Visual Studio的Intellitrace正在记录由Entity Framework生成的每个ADO.NET事件(所有这些都是20,000个)。

So Tools->选项 - > IntelliTrace和取消选中“启用IntelliTrace”修复了问题。

或者也可以通过转到Tools-> Options - >来过滤掉ADO.NET事件。 IntelliTrace - > IntelliTrace事件并取消选中ADO.NET

感谢大家的建议。

此处的一节介绍Will Intellitrace slow down my app

如何Filter IntelliTrace Events

答案 1 :(得分:1)

EF有多个performance considerations,而且众所周知,compared对于其他许多人来说,操作可能比某个orm的预期/期望慢。

(1st)在调试时运行总是会慢一些,并且在构建后第一次运行时总是会慢一些。

所有这些可能取决于您的模型的复杂性。尝试capture the T-SQL statements using SQL Profiler

答案 2 :(得分:1)

如评论中所述,给出的答案仅适用于Visual Studio Ultimate。

从VS2019开始(可能是大多数其他版本),该解决方案通过以下方式实现:

工具>选项>调试>常规

然后取消选中在调试时启用诊断工具

当然,您会失去所有诊断知识和技巧,但是如果您要这样做,它将极大地加快Entity Framework的速度。

更新

上述解决方案对我来说不再起作用。我发现我需要从同一选项列表中进一步取消选中在调试时显示经过的时间PerfTip