【发布时间】:2013-05-31 07:54:25
【问题描述】:
谁能解释一下
- 为什么 DbContext.SaveChanges 在调试模式下的运行速度比生产模式慢约 10 倍?
- 有什么方法可以加快速度吗?
在调试模式下,我的网页加载需要 116 秒,而如果我在不调试的情况下启动项目则需要 15 秒。
我已设置跟踪语句并确定在调试模式下,116 秒中的大约 100 秒用于我的 DbContext.SaveChanges 方法。
在同一个部分只用了 7 秒的时间在不调试的情况下运行项目。
如果您想了解更多信息,请在 cmets 中告诉我。
项目设置:
- ASP.NET 网页
- VS2012
- SQLServer2012
- 实体框架 5.0
附加信息:(如果您需要更多信息,请在 cmets 中告诉我)
- 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?
如果我通过某种编译器魔法以某种方式恢复性能,那么在调试能力方面我会失去什么?目前我无法进入实体框架代码,所以我想我不会错过任何东西。
谢谢!
【问题讨论】:
-
调试时你的连接字符串是什么样子的?
-
@RealityDysfunction 在生产和调试模式下用字符串更新了问题。
-
您是否在 VS 中选中了“仅启用我的代码”?在 Debug Menu->Options and Settings->General->Enable Just My Code 下。也许您没有检查,而 VS 正在尝试调试 EF?
-
@Tombala,即使检查过,性能也一样差。 :(
标签: asp.net performance entity-framework-5 dbcontext intellitrace