22

我正在使用 EF6 rc1 和 Code First 策略,没有预编译视图,问题是:如果我编译并运行 exe 应用程序,运行第一个查询大约需要 15 秒(没关系,因为我仍在处理 pre - 生成的视图)。但是,如果我使用 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));
        }
    }

是时间被消耗的地方。但这很奇怪,因为调试只需要时间。我在这里错过了什么吗?

编辑:找到与该问题相关的更多信息:Using the Process Monitor (by 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,点击按钮,比较加载时间。

4

2 回答 2

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

于 2013-10-29T22:56:09.147 回答
-1

不知道你有没有找到解决办法。但就我而言,在尝试不同的建议后,我遇到了类似的问题,这让我浪费了将近一周的时间。最后,我通过将 web.config 更改为 optimizeCompilations="true" 找到了解决方案,性能从 15-30 秒显着提高到大约 2 秒。

于 2014-04-18T09:56:48.920 回答