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

Jes*_*sse 13 asp.net performance intellitrace dbcontext entity-framework-5

有人可以解释一下

  1. 为什么DbContext.SaveChanges在调试模式下比生产模式慢~10倍?
  2. 有什么方法可以加快速度吗?

在调试模式下,如果我在没有调试的情况下启动项目,我的网页加载时间为116秒,而加载时为15秒.

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

运行项目而不调试在同一部分中花费7秒钟.

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

项目设置:

  • ASP.NET网页
  • VS2012
  • SQLServer2012
  • 实体框架5.0

附加信息:(如果您需要更多,请在评论中告诉我)

  • SaveChanges方法的累积sql查询数为20,000
  • 生产连接字符串:数据源= PC-DEV;初始目录= aspnet-2013-06-04;集成安全性= True; MultipleActiveResultSets = True;应用程序名称= EntityFrameworkMUE
  • Debug Connection String:Data Source = PC-DEV; Initial Catalog = aspnet-2013-06-04; Integrated Security = True; MultipleActiveResultSets = True; Application Name = EntityFrameworkMUE
  • 我也经历过与LocalDB相同的相对性能作为支持数据库

更新:

正如@ruionwriting建议的那样,我描述了数据库,我发现,无论项目是在调试模式还是生产模式下运行,~2,000 sql命令都会花费相同的时间.(每个命令0毫秒).

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

与生产模式相比,该组命令的平均时间差为0.3 ms.

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

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

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

谢谢!

Jes*_*sse 21

Whohoo!

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

所以工具 - >选项 - > IntelliTrace和取消选中"启用IntelliTrace"修复了这个问题.

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

谢谢大家的建议.

这里有一节介绍Will Intellitrace会减慢我的应用程序速度

如何过滤IntelliTrace事件

  • 这仅适用于Visual Studio Ultimate。 (2认同)