14

有人可以解释

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

在调试模式下,我的网页加载需要 116 秒,而如果我在不调试的情况下启动项目则需要 15 秒。

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

在同一部分中仅花费 7 秒的时间在不调试的情况下运行项目。

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

项目设置:

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

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

  • SaveChanges方法累计sql查询次数为20000
  • 生产连接字符串:数据源=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 正在记录实体框架生成的每个 ADO.NET 事件(全部 20、000 个)。

所以工具-> 选项-> IntelliTrace 并取消选中“启用 IntelliTrace”解决了这个问题。

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

感谢大家的建议。

这里有一节讨论Intellitrace 会减慢我的应用程序的速度

如何过滤 IntelliTrace 事件

于 2013-06-13T20:26:13.353 回答
1

EF有多种性能考虑因素,众所周知,许多其他 orm 相比,操作可能比预期/期望的 orm 慢。

(1)在调试时运行总是会更慢,(2)在构建后第一次运行总是会更慢。

所有这些可能取决于模型的复杂性。尝试使用 SQL Profiler 捕获 T-SQL 语句

于 2013-06-12T13:29:15.560 回答
1

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

从 VS2019(可能还有大多数其他版本)开始,解决方案是通过:

工具 > 选项 > 调试 > 常规

然后取消选中Enable Diagnostic Tools while Debugging

当然,您会丢失所有的诊断信息,但如果您要这样做,它会极大地加快实体框架的速度。

更新:

上述解决方案停止为我工作。我发现在从同一选项列表进行调试时,我需要进一步取消选中 Show elapsed time PerfTip 。

于 2019-08-20T04:03:35.773 回答