zoukankan      html  css  js  c++  java
  • EF初次加载优化

    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:WindowsMicrosoft.NETFramework64v4.0.30319

    3 、定位到项目dll所在的目录,执行ngen命令,如:

    ngen  E:SourceWorkspace sKRWebSitesProcurementProcurement-201708161- Presentention

    Procurement.OpinEntityFramework.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

  • 相关阅读:
    BZOJ4669 抢夺(网络流)
    三元环&四元环计数
    P3768 简单的数学题(杜教筛)
    P1829 [国家集训队]Crash的数字表格(莫比乌斯反演)
    P5221 Product(欧拉函数)
    P3704 [SDOI2017]数字表格(莫比乌斯反演)
    P4619 [SDOI2018]旧试题
    Loj6102. 「2017 山东二轮集训 Day1」第三题(min-max 反演)
    Leetcode220 存在重复元素III
    Leetcode219 存在重复元素II 滑动窗口
  • 原文地址:https://www.cnblogs.com/kevin1988/p/7772250.html
Copyright © 2011-2022 走看看