测量ASP.NET MVC 3的性能

我在ASP.NET MVC 3中构建了一个JSON服务,我希望能够测量应用程序中操作的执行时间(我希望它能够自动记录慢速操作)。

因此看起来很棒; http://coderjournal.com/2010/10/timing-the-execution-time-of-your-mvc-actions/ (这里有关于堆栈溢出的地方也提到了)

问题是我得到的测量结果必然是错误的; 我添加了另一个秒表,它启动动作中的第一件事并在返回前停止。

例:

  • 方法里面的秒表=> 10ms (这里省略了序列化到json,所以我可以理解它比实际更短)
  • 秒表属性(上面的代码)=> 676ms
  • Firefox称该请求耗时=> 70ms

我相信firefox在这里有正确的时间(但它包含下载所以它有点大),但我想了解为什么属性代码不起作用,对此有什么想法?

这可能不是它显示执行时间长的原因,但是当您一次有多个请求时,该属性将无法与mvc 3一起正常工作。

在以前版本的ASP.NET MVC中,除少数情况外,每个请求都会创建操作filter。 这种行为从来都不是保证行为,而只是一个实现细节,而filter的合同是将它们视为无状态。 在ASP.NET MVC 3中,filter被更积极地缓存。 因此,任何不正确地存储实例状态的自定义操作filter都可能被破坏。

我建议在OnActionExecuting实例化新的秒表并将其保存到HttpContext.Current.Items – 然后你可以在OnActionExecuted检索它并打印出结果。

除了回答https://stackoverflow.com/a/5823555/504082之外,更正确的方法是在时钟执行结束时使用OnResultExecuted覆盖。 你什么时候回来

 ActionResponse.Success(arr.Select(x => func(x)).ToJson(); 

即一些懒惰的LINQ语句由于你的动作,它将动作“执行” 计算(函数’func’执行不会计入动作执行时间)。 我有这个讨厌的bug,无法弄清楚为什么我的动作“执行时间”是100毫秒,虽然web请求执行10秒。 修改后的代码。

 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Web; using System.Web.Mvc; namespace SW { public class StopwatchAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { var stopwatch = new Stopwatch(); filterContext.HttpContext.Items["Stopwatch"] = stopwatch; stopwatch.Start(); } public override void OnResultExecuted(ResultExecutedContext filterContext) { var stopwatch = (Stopwatch)filterContext.HttpContext.Items["Stopwatch"]; stopwatch.Stop(); var httpContext = filterContext.HttpContext; var response = httpContext.Response; response.AddHeader("X-Runtime", stopwatch.Elapsed.TotalMilliseconds.ToString()); } } } 

为什么不看看Rhino commons的页面性能模块 ?

看起来你已经停了一个数量级。 你确定你正确地读了结果吗? 尝试使用Stopwatch.ElapsedMilliseconds属性。