EF6 / Code First:在第一次查询期间超级慢,但仅在Debug中

时间:2013-08-30 18:43:42

标签: entity-framework visual-studio-2013 entity-framework-6

我正在使用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运行,单击按钮并比较加载时间。

2 个答案:

答案 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秒。