我使用Visual Studio 2012和Windows 7,64位架构,4核实现了Entity Framework 4.0 .net 4.0。
我正在使用AdventureWorks数据库对控制台应用程序执行一些测试。困扰我的是我第一次拿一些产品比第二次需要更多的时间,我想知道为什么。
我知道Entity Framework在第一次查询时会执行一些任务,所以我提前执行了一些额外的查询。
例如,我的main函数包含以下内容:
using (var context = new Context())
{
execute context.Clients.ToList(); // <- this takes something like 300 ms
}
using (var context = new Context())
{
execute context.Products.ToList(); // <- this takes something like 200 ms
}
using (var context = new Context())
{
execute context.Products.ToList(); // <- this takes something like 10 ms
}
所以你看到所有“第一次执行”事情的第一个查询花了300毫秒。
第二个需要200秒,第三个与第二个相同只需要10毫秒。
所以我的问题是:为什么我的第三个查询花了这么短的时间?我不使用自动编译(因为在EF 4.0中没有这样的)或CompiledQuery类。
此外,我对Products的第一次调用不是模型的第一个查询,因此应该已经完成了视图生成的所有工作。
但是第一次花费这么多时间并且第二次打电话给产品时这么快。它在某处缓存了什么吗?
我注意到的另一件事是,当我将它编译为64位时,需要花费大量时间,比如一秒钟。当我将它编译为32位时,它需要我给出的数量。
你能在这里给我一些提示吗?谢谢
答案 0 :(得分:0)
阅读本文:Performance Considerations (Entity Framework)
除了生成视图外,EF还有很多工作要做。
此外,您对Products
的第一次查询可能会导致您的数据库服务器将数据读入其缓存中。您应该使用SQL Server Profiler来区分数据库性能差异和客户端(EF)性能差异。
关于64位问题,这让我想起了a previous SO question。