我正在使用EF6 rc1和Code First策略,没有预编译视图,问题是: 如果我编译并运行exe应用程序,则运行第一个查询需要15秒(这没关系,因为我还在处理预生成的视图)。但是,如果我使用Visual Studio 2013 Preview来调试完全相同的应用程序,那么在运行第一个查询之前需要将近2分钟:
Dim Context = New MyEntities()
Dim Query = From I in Context.Itens '' <--- The debug takes 2 minutes in here
Dim Item = Query.FirstOrDefault()
有没有办法消除这个额外的时间?我在这里做错了吗?
Ps。:上下文本身并不复杂,只有200多个表格。
编辑:发现问题是在调试期间,EF似乎生成忽略预先生成的视图的视图。 使用EF的源代码我发现了属性:
IQueryProvider IQueryable.Provider
{
get
{
return _provider ?? (_provider = new DbQueryProvider(
GetInternalQueryWithCheck("IQueryable.Provider").InternalContext,
GetInternalQueryWithCheck("IQueryable.Provider").ObjectQueryProvider));
}
}
是消耗时间的地方。但这很奇怪,因为调试只需要一些时间。我在这里错过了什么吗?
编辑:发现更多与该问题相关的信息: 使用进程监视器(由Sysinternals)我发现它的'desenv.exe'进程耗费了大量的时间。更具体地说,它是“螺纹退出”的消耗时间。它重复36次线程退出堆栈。我不知道这个信息是否非常有用,但我用堆栈保存了一个'.cvs',这是他的身体:[...](编辑:删除'.cvs'的身体,我可以再次发布通过评论,如果有人真的认为它会有用,但它会让人感到困惑和太大。)
编辑:已安装VS2013 Ultimate和Entity Framework 6 RTM。安装了Entity Framework Power Tools Beta 4并使用它来生成视图。什么都没有改变......如果我运行exe需要20秒,如果我'开始'调试它需要120秒。
编辑:创建了一个小项目来模拟错误:http://sdrv.ms/16pH9Vm 只需在环境中运行项目,直接通过.exe运行,单击按钮并比较加载时间。
答案 0 :(得分:13)
这是附加调试器时Lazy(EF正在使用)中的一个已知性能问题。我们目前正在进行修复(目前我们正在考虑的方法是删除Lazy的使用)。我们希望尽快在修补程序版本中发布此修复程序。您可以在我们的CodePlex网站上跟踪此问题的进展情况 - http://entityframework.codeplex.com/workitem/1778。
有关即将发布的6.0.2修补程序版本的详细信息将包括修复程序 - http://blogs.msdn.com/b/adonet/archive/2013/10/31/ef6-performance-issues.aspx
答案 1 :(得分:-1)
我不知道你是否找到了解决方案。但在我的情况下,我有类似的问题,在尝试不同的建议后近一周就浪费了我。最后,我找到了一个解决方案,将我的web.config更改为optimizeCompilations =&#34; true&#34;并且性能从15-30秒急剧提高到约2秒。