Entity Framework 第一次查询时严重延迟的问题
因为在园子里没有查到相关文章,所以发到首页让大家拍砖。
起因:每次跑xUnit总是第一个测试需要十几秒的执行时间而其他最久0.5s都不到,我是个懒人发现这个问题的时候也没有去多想还是做手上的东西,但是心里的刺埋下了。(这里对xUnit说明下老鸟绕过,每个测试都是独立的对象,而我这个resharper的计算也是只计算每个实例的创建执行时间,因为xunit里创建实例的构造函数就是通常说的setup)
有图有真相
我走的弯路,可以直接绕过看结果:
无脑的先用Test with performance;结果如下
还以为看错了,linq编译怎么可能需要这么长时间,无脑的我去找ComplieQuery,心里还嘀咕“这个版本的EF不是会自动编译么,就算再编译这个时间级别也不太可能,难道是数据库访问的延时?。。。。。。”。
结果在Google的时候发现大家对Pre-Generated Views 来提升性能相当热衷,好吧这个可能性大点,然后就是搞T4(真强大,没听过的同学可以去看看),结果人家已经在EFPowerTools里已经集成了。
在项目里加上EFUnitOfWork.Views.cs心里真痛快,再跑跑,好吧不需要图了因为跟第一幅图差不多。
这段话点醒了我,这个也太lazy了,不明白这样设计的道理,让初始化延迟到查询?
the initialization of DbContext is lazy so creating an instance doesn't really do much until you actually use it. If you want to front load the initialization work you can call context.Database.Initialize(force: false). Note that passing false for the force parameter will only cause initialization to happen if it hasn't already. The init time depends a lot on the complexity of your model and what database initializer you are using. The best bet would be to run the profiler on it and see where the time is being spent, then we can probably help out with some suggestions.
有图有真相
没办法,还是用dottrace4.5吧,Database.Initialize用时最长,希望能对使用Ef的同学有点帮助,另外请对Ef有研究的同学赐教,不胜感激,Orz拜谢。
PS:EF= Code Fist;PC=i5+8G ram+x64win7