即使对于小型 DbContext,EF 启动时间也为 7 秒

2024-04-06

我正在尝试减少基于 EF 的应用程序的启动时间,但我发现即使对于单实体上下文,我也无法将初始读取所需的时间减少到 7 秒以下。特别奇怪的是,这次不是特定于上下文类型的。

谁能解释一下导致这些缓慢时间的原因和/或我如何才能让事情运行得更快?

这是完整的示例代码:

在我的数据库中,我有一个名为 se_stores 的表,其中包含主键列 AptId:

    // a sample entity class
public class Apartment
{
    public int AptId { get; set; }
}

    // two identical DbContexts        

public class MyDbContext1 : DbContext
{
    public MyDbContext1(string connectionString) : base(connectionString)
    {           
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<MyDbContext1>(null);

        var config = new EntityTypeConfiguration<Apartment>();
        config.HasKey(a => a.AptId).ToTable("se_stores");
        modelBuilder.Configurations.Add(config);

        base.OnModelCreating(modelBuilder);
    }
}

public class MyDbContext2 : DbContext
{
    public MyDbContext2(string connectionString)
        : base(connectionString)
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<MyDbContext2>(null);

        var config = new EntityTypeConfiguration<Apartment>();
        config.HasKey(a => a.AptId).ToTable("apartments");
        modelBuilder.Configurations.Add(config);

        base.OnModelCreating(modelBuilder);
    }
}

    // finally, I run this code using NUnit:

var start = DateTime.Now;
var apt1 = new MyDbContext1(connectionString).Set<Apartment>().FirstOrDefault();
var t1 = DateTime.Now - start;
start = DateTime.Now;
var apt2 = new MyDbContext2(connectionString).Set<Apartment>().FirstOrDefault();
var t2 = DateTime.Now - start;
Console.WriteLine(t1.TotalSeconds + ", " + t2.TotalSeconds);

它可靠地打印如下内容:7.5277527, 0.060006。当我首先将测试切换为使用 MyDbContext2 时,我得到相同的结果(因此无论哪个 DbContext 首先初始化都会发生这种情况)。我还尝试使用 EF 电动工具预生成视图。这将第一个上下文的时间减少到了 6.8 秒左右,因此只是一个小小的胜利。

我知道 DateTime.Now 是一种糟糕的分析方法,但这些结果在使用 dotTrace 时仍然有效。我还知道第一次运行某些代码会引发 JITing 成本,但 7 秒似乎太高,无法归因于这一点。

我在 VS 2010 中使用 EF 4.3.1 和 .NET 4。

在此先感谢您的帮助!

编辑:有人建议打开 SQL 连接可能会导致问题。

  1. 我首先尝试使用原始 SqlConnection 运行随机查询,并使用相同的连接字符串创建命令。这花了1秒,并没有影响DbContext初始化的时间。
  2. 然后,我尝试使用连接字符串创建 SqlConnection 并将其传递给采用连接的 DbContext 构造函数。我通过了 contextOwnsConnection=false。这对 DbContext 初始化时间也没有影响。
  3. 最后,我尝试使用相同的凭据和连接字符串选项通过 Management Studio 进行连接。这几乎是瞬时的。
  4. 在 dotTrace 配置文件中,它测量 SqlConnectionFactory.CreateConnection(connectionString) 需要 0.7 秒,这与原始 SQL 时间一致。

编辑:我想知道延迟是每次连接还是仅一次。因此,我尝试让 MyDbContext1 和 MyDbContext2 连接到不同服务器上完全不同的数据库。无论首先连接到哪个数据库,这都没有什么区别:使用第一个 DbContext 大约需要 7 秒,而使用第二个上下文则非常快。


将您编写的代码放入自己的项目中后,我发现项目的平台目标对 EF 框架的启动时间有很大影响。

当针对 x64 平台时,我收到了与您类似的结果(第一个 DbContext 上旋转 7 秒,第二个 DbContext 旋转

我不确定为什么会发生这种情况,但它一定与实体框架在不同环境中初始化自身的方式有关。我已经发布了一个单独的问题here https://stackoverflow.com/questions/12584628/entity-framework-spinup-much-slower-on-x64-vs-x86.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即使对于小型 DbContext,EF 启动时间也为 7 秒 的相关文章

随机推荐

  • JQuery UI 加载事件?

    有没有办法不仅检测 jquery UI 是否加载 而且在加载时触发一个事件 现在 我将代码包装在 document ready 函数中 但有时 UI 代码会出错 因为 UI 库未完全加载 所有内容都按正确的顺序加载 该代码在 99 的情况下
  • 如何使用 https 运行 Vue.js 开发服务?

    我正在使用 Vue cli 使用 webpack 模板创建 vue 项目 如何在开发中使用 https 运行它 npm run dev 在最新的vuejs 截至2018年5月7日 中 需要在项目根目录下添加一个 vue config js
  • 为什么我的 Express 路由器中间件没有定义 req.route?

    我正在尝试使用路由器中间件来获取以下值请求路由 https expressjs com en api html req route 我有一些像这样的简单代码 服务器 js import api from api app use api ap
  • webView:didFailLoadWithError -1004: 在 Phonegap ios 中连接 google plus 时无法连接到服务器

    在获取配置文件数据之前接受 google plus 身份验证时 我收到 webView didFailLoadWithError 1004 无法连接到服务器 错误 这些代码之前可以正常工作 现在我面临这些错误 不知道为什么我无法连接 请帮助
  • 使用鼠标光标捕获屏幕截图

    我使用以下代码在 Windows 上获取屏幕截图 hdcMem CreateCompatibleDC hdc int cx GetDeviceCaps hdc HORZRES int cy GetDeviceCaps hdc VERTRES
  • 正确的原型继承

    所以我真的查遍了互联网 发现了许多在 javascript 中设置原型继承的不同方法 其中一些使用call 其中一些使用以下语法 var rabbit prototype new Animal 有些在更改原型后更改构造函数 有些则不更改 有
  • vim :AnsiEsc - 如何默认打开它们?

    我有带有彩色日志条目的日志文件 假设扩展名为 smt2 其中颜色由 ansi 转义码定义 我安装了vim插件基于AnsiEsc vim http www vim org scripts script php script id 302 现在
  • awk 解析文件名并将结果添加到每行末尾

    我有许多名称相似的文件 例如 DWH Export AUSTA 20120701 20120731 v1 1 csv 397 dat 2012 10 02 04 01 46 out DWH Export AUSTA 20120701 201
  • 人类友好的二进制编码

    不久前 我发现一个网站描述了一种对人类友好的二进制到文本编码 例如 在输入 用于解码 时 它接受 0 o 和 O 全部作为相同的值 因为人们往往很容易混合这些字符 不幸的是我不记得它是怎么叫的 编辑 这就是我正在寻找的 其他Base32 的
  • retq 和 ret 有什么区别?

    让我们考虑以下程序 它计算参数的无符号平方 global foo text foo mov rdi rax mul rdi ret 这是正确编译的as 但反汇编为 0000000000000000
  • 如何设置iPhone振动时长?

    我正在使用 AudioServicesPlaySystemSound 来调用振动函数 AudioServicesPlaySystemSound kSystemSoundID Vibrate 有什么办法可以设置振动的持续时间吗 我知道默认持续
  • ASP .NET 5 MVC 6 Identity 3 角色声明组 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我目前正在寻找一种解决方案 以在带有 Identity 3 的 ASP NET 5 MVC 6 中使用高级角色 组权限管理 我启动了一
  • Spring MVC 返回自定义 HTTP 状态代码(无错误)

    在 Spring MVC RequestMapping 注释中 我返回 JSP 页面名称作为结果 这将返回 HTTP 状态代码 200 OK 如何将此状态代码更改为 201 创建之类的内容 ResponseStatus 不起作用 另外 Ht
  • JPA:如何对实体中的 Set 字段进行排序?

    我正在使用 Spring 3 2 11 RELEASE Hibernate 4 3 6 Final 和 JPA 2 1 我有以下具有以下字段的实体 Entity Table name user public class User imple
  • 如何在 Spring MVC 中将正确的 JSON 传递给控制器​​?

    我不明白为什么在将 POST 请求传递给时会收到 HTTP 415http localhost 8080 company 我在 POST 请求中的 JSON id 7 name IBM 这是我在控制器中的方法 Controller Requ
  • 为什么在 swift 中创建 String 时会出现内存泄漏?

    泄漏是一个根漏 在此图像中 在同一行上发生了多次 但下面还有另一个称为单次 也会产生泄漏 这是调用堆栈after调用前面提到的代码行 这是 Instruments 定位泄漏的类 class Item var id String var na
  • 为什么我的 schema.ddl 在 hibernate3-maven-plugin 之后是空的?

    这是项目的目录结构 使用maven2 pom xml src main java Abc java resources hibernate cfg xml database properties META INF persistence x
  • 公共属性和私有成员 C#

    只使用公共属性而不是使用公共属性来访问私有变量有什么好处 例如 public int iMyInt get set 代替 private int myint public int iMyInt get return myint set my
  • GET 或 POST 哪个比另一个更安全?

    当比较 HTTP GET 和 HTTP POST 时 从安全角度来看有什么区别 其中一种选择本质上比另一种更安全吗 如果是这样 为什么 我意识到 POST 不会公开 URL 上的信息 但是这有什么真正的价值 还是只是通过模糊来实现安全 当考
  • 即使对于小型 DbContext,EF 启动时间也为 7 秒

    我正在尝试减少基于 EF 的应用程序的启动时间 但我发现即使对于单实体上下文 我也无法将初始读取所需的时间减少到 7 秒以下 特别奇怪的是 这次不是特定于上下文类型的 谁能解释一下导致这些缓慢时间的原因和 或我如何才能让事情运行得更快 这是