One
1开启对应网站预加载
2、 编辑网站对应应用程序池启动模式
Two
安装Application Initialization、Application Initialization for UI
相关地址:https://www.iis.net/downloads/microsoft/application-initialization
https://blogs.msdn.microsoft.com/amol/2013/01/25/application-initialization-ui-for-iis-7-5/
安装成功之后出现如图所示模块:
代码优化
1、禁用第一次ef查询对表__MigrationHistory的问题。使用了ef的Code first会在第一次ef查询的时候会对__MigrationHistory访问,是为了检查数据库和model是否匹配,以保证ef能正常运行。解决办法:在DbContext初始化添加代码Database.SetInitializer<InsuranceDbContext>(null) 或在Application_Start添加。
2、EF Pre-Generated Mapping Views(预生成映射视图)
Application_Start加入下面代码:
using (var dbcontext = new InsuranceReadOnlyDbContext())
{
var objectContext = ((IObjectContextAdapter)dbcontext).ObjectContext;
var mappingCollection = (StorageMappingItemCollection)objectContext.MetadataWork
space.GetItemCollection(DataSpace.CSSpace);
mappingCollection.GenerateViews(new List<EdmSchemaError>());
}
using (var dbcontext = new InsuranceDbContext())
{
var objectContext = ((IObjectContextAdapter)dbcontext).ObjectContext;
var mappingCollection = (StorageMappingItemCollection)objectContext.MetadataWork
space.GetItemCollection(DataSpace.CSSpace);
mappingCollection.GenerateViews(new List<EdmSchemaError>());
}·
3 Ngen优化(用Ngen安装生成EF的本地镜像)
1、打开cmd窗口
2、cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319
3 、定位到项目dll所在的目录,执行ngen命令,如:
ngen E:\Source\Workspace s\KR\WebSites\Procurement\Procurement-20170816\1- Presentention\
Procurement.Op\bin\EntityFramework.dll
1. 问题原因分析
1.1.1. EF方面的原因:
1、Code First第一次启动会对比程序中的Model与数据库表(database initializer ),生成Model与数据库的映射视图
2、随着EF的开源,EF从6开始就不会包含在.net Framework中,安装.net Framework默认是不会安装EF的。因此EF程序集就没有生成本地镜像,这样每次程序启动,EF的代码都会通过just-in-time (JIT) compiler(即时编译器)把MSIL中间代码编译成本机能识别的本地代码。因为这个生成的本地代码存在程序运行的进程里面的内存中,它将回收当程序进程被终止(例如:iis程序池回收,程序池默认是按需触发运行的,没人访问它就不启动了)。由于EF框架还是比较大的,EF6文件大小到4-5M了,所以每次启动都要重写编译本地代码有比较明显的性能影响。
1.1.2. 其他原因:
1、站点更新后重新加载程序文件;
2、iis程序池回收后也会需要重新加载(程序池默认是按需触发运行的,没人访问它就不启动了)
MVC的程序第一次访问比较慢的的问题由于第一次是要处理视图文件.cshtml(生成为.cs文件)、加载引用的dll程序文件和初始化程序池等等。
2. 参考资料
http://www.cnblogs.com/yangecnu/p/Speed-First-Startup-of-the-Entity-Framework.html
https://blogs.msdn.microsoft.com/amol/2013/01/25/application-initialization-ui-for-iis-7-5/
https://www.lanhusoft.com/Article/127.html