在基于包含大约200个表和实体框架的数据库之上构建WCF,在构建WCF之后第一次执行登录需要花费大量时间(大约2分钟)。
单步执行代码会发现IQueryable.Count方法是罪魁祸首。
这仅在构建WCF代码后第一次发生。如预期的那样,连续执行Count方法的速度很快。
可能是什么原因?实体是在重建代码后进行某种背景缓存排序吗?
请分享您的想法!
更新:
@Craig:感谢您预览视图link
此外,此link还有很多针对EF
的性能改进建议另外,请查看EF library的延迟加载。
答案 0 :(得分:5)
这是一个已知的问题resolved with .NET 4.0。
首次运行基于Web的应用程序时,必须缓存代码。从那时起,它全速运行。本文通过在第一个用户访问服务之前预先运行代码来显示避免此初始减速的当前方法。
答案 1 :(得分:3)
Lame Duck的回答是有帮助的(上调),但它并没有说明完整的故事。第一次执行实体框架查询时,会发生一些事情。一种是视图生成,其中SQL被编译用于常见查询,例如加载实体集和加载单个实体。 But view generation can also be done at compile time,它保存第一个不幸的人来运行查询此步骤的性能开销。每当初始化新的ObjectContext时,都会重复此步骤,因此在编译时进行视图生成的小开销在运行时会大大回报。第二个是将IQueryable编译成规范命令树,可以使用CompiledQuery进行优化。您可能正面临这些问题中的一个或两个,因此在将其作为.NET 3.5 SP 1问题编写之前,请务必将其检出。