安装MiniProfiler

MVC + EF + Bootstrap 2 权限管理系统入门级(附源码)文章中下载了它的源码,调试模式下打开一个页面都要再2.5秒以上,所以使用MiniProfiler、MiniProfiler.MVC4 、MiniProfiler.EF6组件进行了分析。

首先,依次序安装组件。然后,修改Global.aspx.cs 文件:

 protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles); //自定义View
ViewEngines.Engines.Clear();
ExtendedRazorViewEngine engine = new ExtendedRazorViewEngine();
engine.AddPartialViewLocationFormat("~/Areas/Common/Views/Shared/{0}.cshtml");
engine.AddPartialViewLocationFormat("~/Areas/Common/Views/Shared/{0}.vbhtml");
ViewEngines.Engines.Add(engine); //Model去除前后空格
ModelBinders.Binders.DefaultBinder = new TrimModelBinder(); //设置MEF依赖注入容器
MefConfig.RegisterMef(); //初始化EF6的性能监控
MiniProfilerEF6.Initialize(); //初始化DB
DatabaseInitializer.Initialize();
} protected void Application_BeginRequest()
{
StackExchange.Profiling.MiniProfiler.Start();
}
protected void Application_EndRequest()
{
StackExchange.Profiling.MiniProfiler.Stop();
}

MiniProfilerEF6.Initialize(); 一定要放在 DatabaseInitializer.Initialize(); 之前,否则会报如下错误:

An exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll but was not handled in user code. Additional information: The Entity Framework was already using a DbConfiguration instance before an attempt was made to add an 'Loaded' event handler. 'Loaded' event handlers can only be added as part of application start up before the Entity Framework is used."

运行站点有可能还会遇到这个错误:

An exception of type 'System.Data.SqlClient.SqlException' occurred in MiniProfiler.dll but was not handled in user code

Additional information: Invalid column name 'CreatedOn'.

解决方法是:

1.禁用这种类型的异常断点(不可取)

2.删除packages\MiniProfiler.3.2.0.157\lib\net40 下的MiniProfiler.PDB文件(我是这么做的)

3.禁用EF的数据库变化跟踪(未验证,应该管用)

Found an answer for my question. Thanks all for replies.

Database.SetInitializer<MyContext<Label>>(null);
This fixes the problem and disables DB changes tracking in EF.

运行站点打开登陆页

Sql占了47.7%,点开可以查看执行了哪些sql语句。

分析页面耗时

首先,调试模式下运行Debug和Release代码,耗时差不多都很长,截图如下:

    

   

然后,非调试模式(Ctrl+F5)运行,截图如下:

非调试模式(Ctrl+F5)的效率还是挺不错的,没想到和调试模式(F5)差别会这么大。使用必应搜了一下找到一个帖子 :Visual C++: Difference between Start with/without debugging in Release mode

里面的解释是

The problem is that Windows drops in a special Debug Heap, if it detects that your program is running under a Debugger. This appears to happen at the OS level, and is independent of any Debug/Release mode settings for your compilation.

You can work around this 'feature' by setting an environment variable: _NO_DEBUG_HEAP=1

This same issue has been driving me nuts for a while; today I found the following, from whence this post is derived: http://blogs.msdn.com/b/larryosterman/archive/2008/09/03/anatomy-of-a-heisenbug.aspx

另外为了更细化的跟踪某个方法的耗时可以在代码中这么写:

    public AdminLayoutAttribute()
{
//TODO: Test
//var userRole = new List<UserRole> { new UserRole { Id = 1, UserId = 1, RoleId = 1 } };
//var user = new User { Id = 1, LoginName = "admin", LoginPwd = "8wdJLK8mokI=", UserRole = userRole };
//SessionHelper.SetSession("CurrentUser", user);
var user = SessionHelper.GetSession("CurrentUser") as User;
if (user != null)
{ // using (StackExchange.Profiling.MiniProfiler.StepStatic("AdminLayout"))
using (MiniProfiler.Current.Step("AdminLayout"))
{
// Enqueue a job
var container = System.Web.HttpContext.Current.Application["Container"] as CompositionContainer;
UserService = container.GetExportedValueOrDefault<IUserService>();
RoleService = container.GetExportedValueOrDefault<IRoleService>();
RoleModulePermissionService = container.GetExportedValueOrDefault<IRoleModulePermissionService>();
ModuleService = container.GetExportedValueOrDefault<IModuleService>();
ModulePermissionService = container.GetExportedValueOrDefault<IModulePermissionService>();
PermissionService = container.GetExportedValueOrDefault<IPermissionService>();
}
}
}

再次访问模块管理时就可以看到AdminLayout的耗时了,好像耗时特别小时这里就不记录

总之有这么一个组件确实可以量化执行过程的耗时。对方法调用次数执行分析更强大的工具还是DotTrace,如图:

参考链接:

MiniProfiler(MiniProfiler.EF6监控调试MVC5和EF6的性能)

解决:MiniProfiler.EF出现System.InvalidOperationException”类型的异常在 EntityFramework.dll 中发生

Entity Framework 4.3. Invalid column name 'CreatedOn'

Miniprofiler breaks on missing CreatedOn column

使用MiniProfiler跟踪MVC + EF + Bootstrap 2 权限管理系统的性能消耗的更多相关文章

  1. MVC + EF + Bootstrap 2 权限管理系统入门级(附源码)

    MVC .EF 学习有大半年了,用的还不是很熟练,正好以做这样一个简单的权限管理系统作为学习的切入点,还是非常合适的. 开发环境: VS 2013 + Git + MVC 5 + EF 6 Code ...

  2. SQLSERVER 数据库性能的的基本 MVC + EF + Bootstrap 2 权限管理

    SQLSERVER 数据库性能的基本 很久没有写文章了,在系统正式上线之前,DBA一般都要测试一下服务器的性能 比如你有很多的服务器,有些做web服务器,有些做缓存服务器,有些做文件服务器,有些做数据 ...

  3. ABP+AdminLTE+Bootstrap Table权限管理系统第五节--WBEAPI及SwaggerUI

    一,Web API ABP的动态WebApi实现了直接对服务层的调用(其实病没有跨过ApiController,只是将ApiController公共化,对于这一点的处理类似于MVC,对服务端的 调用没 ...

  4. ABP+AdminLTE+Bootstrap Table权限管理系统第六节--abp控制器扩展及json封装

    一,控制器AbpController 说完了Swagger ui 我们再来说一下abp对控制器的处理和json的封装. 首先我们定义一个控制器,在新增控制器的时候,控制器会自动继承自AbpContro ...

  5. ABP+AdminLTE+Bootstrap Table权限管理系统第九节--AdminLTE模板页搭建

    AdminLTE 官网地址:https://adminlte.io/themes/AdminLTE/index2.html 首先去官网下载包下来,然后引入项目. 然后我们在web层添加区域Admin以 ...

  6. ABP+AdminLTE+Bootstrap Table权限管理系统第八节--ABP错误机制及AbpSession相关

    上一节我们讲到登录逻辑,我做的登录逻辑很简单的,我们来看一下abp module-zero里面的登录代码. #region Login / Logout public ActionResult Log ...

  7. ABP+AdminLTE+Bootstrap Table权限管理系统第七节--登录逻辑及abp封装的Javascript函数库

    经过前几节,我们已经解决数据库,模型,DTO,控制器和注入等问题.那么再来看一下登录逻辑.这里算是前面几节的一个初次试水. 首先我们数据库已经有的相应的数据. 模型和DTO已经建好,所以我们直接在服务 ...

  8. ABP+AdminLTE+Bootstrap Table权限管理系统第九节--AdminLTE引入及模板页和布局和菜单

    返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 AdminLTE AdminLTE 官网地址:https://adminlte.io/themes/AdminLT ...

  9. ABP+AdminLTE+Bootstrap Table权限管理系统第七节--登录逻辑及几种abp封装的Javascript函数库

    返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期         简介 经过前几节,我们已经解决数据库,模型,DTO,控制器和注入等问题.那么再来看一下登录逻辑.这 ...

随机推荐

  1. Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明

    一.基础说明 这里说的“通用接口(CommonAPIs)”是使用微信公众账号一系列高级功能的必备验证功能(应用于开发模式). 我们通过微信后台唯一的凭证,向通用接口发出请求,得到访问令牌(Access ...

  2. redis系列-主从复制

    redis自身提供了主从的机制,通过配置可以实现服务的备份(Master->Slave). 配置项 slaveof <masterip> <masterport> mas ...

  3. 翻译:AKKA笔记 - 介绍Actors

    任何以前做过多线程的人都不会否认管理多线程程序是困难并且痛苦的. 我说管理是因为它开始很容易而且当你看到性能提升时会很兴奋.但是,当你看到你没法从子线程的错误中恢复 或者 这些僵尸bug很难重现 或者 ...

  4. 我也说百度和google

    对于程序员,最好的老师恐怕还是百度或者google或一些专业的it社区.网站了罢! 之前曾听到这样的一句话, 文艺程序员用Google Scholar/Scirus/stackoverflow.普通程 ...

  5. Java中main()的args的知识点浅谈

    我们先来了解下Java中main()方法的默认定义格式: public static void main(String[] args){ }1.main方法是程序执行的入口,除了args这个形参变量可 ...

  6. IIS集成模式下,URL重写后获取不到Session值

    近期给公司网站添加了伪静态功能,但是今天发现了在伪静态的页面中,Session值是获取不到的. 原因是在伪静态请求的时候,Session请求被“过滤”掉了. 开始是把web.config文件中的mod ...

  7. 使用swoole和websocket结合来制造弹幕

    在知乎上无意中看到了一篇有关这个的话题https://zhuanlan.zhihu.com/p/23992890,刚好没事也好久没弄swoole了就自己按照知乎上的那篇文站实操了一下 那个试验中有几个 ...

  8. ASP.NET MVC在线人数统计

    在Global.asax.cs文件中代码: protected void Application_Start() { Application[; AreaRegistration.RegisterAl ...

  9. MYSQL数据表建立外键

    MySQL创建关联表可以理解为是两个表之间有个外键关系,但这两个表必须满足三个条件1.两个表必须是InnoDB数据引擎2.使用在外键关系的域必须为索引型(Index)3.使用在外键关系的域必须与数据类 ...

  10. toString()方法

    前面的话 本文将介绍toString()方法,toString()方法返回反映这个对象的字符串 [1]undefined和null没有toString()方法 undefined.toString() ...