2

我得到了 .net 4.0 和 Entity Framework 4.0 和 Visual Studio 2012 和 Windows 7,64 位架构,4 核。

我正在使用 AdventureWorks 数据库在控制台应用程序上执行一些测试。困扰我的是我第一次服用一些产品比第二次要花更多的时间,我想知道为什么。

我知道实体框架在第一次查询期间执行了一些任务,所以我提前执行了一些额外的查询。

例如,我的主要功能包含以下内容:

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 毫秒。

第二个需要 200s,第三个和第二个一样只需要 10ms。

所以我的问题是:为什么我的第三个查询需要这么短的时间?我不使用自动编译(因为 EF 4.0 中没有此类)或 CompiledQuery 类。

此外,我对 Products 的第一次调用不是对模型的第一次查询,因此视图生成的所有工作都应该已经完成​​。

但是第一次还是要花很多时间,第二次我打电话给产品时又是如此之快。它是否在某处缓存了某些东西?

我注意到的另一件事是,当我将它编译为 64 位时,它需要很长的时间,比如一秒钟。当我将它编译为 32 位时,它需要我给的数量。

你能在这里给我一些提示吗?

谢谢

4

1 回答 1

0

阅读本文:性能注意事项(实体框架)

除了生成视图之外,EF 还需要做很多工作。

此外,您的第一个查询Products可能会导致您的数据库服务器将数据读入其缓存。您应该使用 SQL Server Profiler 来区分数据库性能差异和客户端 (EF) 性能差异。

关于 64 位问题,这让我想起了之前的 SO question

于 2012-10-31T20:10:02.533 回答