我试图缩短基于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秒似乎太高了,无法归因于此。
我使用EF 4.3.1和.NET 4与VS 2010。
提前感谢您的帮助!
编辑:有人建议打开SQL连接可能会导致问题。
编辑:我想知道延迟是每个连接还是只有一次。因此,我尝试让MyDbContext1和MyDbContext2连接到不同服务器上的完全不同的数据库。不管首先连接到哪个数据库,这都没有什么区别:第一个DbContext的使用花费了大约7秒,而第二个上下文的使用速度非常快。
发布于 2012-09-25 06:12:29
在将您编写的代码放在自己的项目中之后,我发现项目的平台目标对EF框架的启动时间有很大影响。
当以x64平台为目标时,我收到了类似于您的结果(第一个DbContext上有7秒旋转,第二个DbContext上小于1秒)。当目标为x86时,第一个DbContext的自旋时间将减少约4秒,降至3.34633秒,而第二个DbContext所需的时间与x64情况下的时间相同。
我不知道为什么会发生这种情况,但它必须与实体框架如何在不同的环境中初始化自己有关。我已经发布了一个关于那个here的单独问题。
发布于 2012-09-24 14:36:26
根据一些注释,第二次运行速度这么快的原因是连接管理器缓存连接。这让我相信,获得最初的联系是问题所在。
要尝试的事情:
https://stackoverflow.com/questions/12572623
复制相似问题