测量ASP.NET MVC的性能3

ull*_*ark 11 c# diagnostics 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在这里有正确的时间(但它包含下载所以它有点大),但我想了解为什么属性代码不起作用,对此有什么想法?

Luk*_*tný 16

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

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

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


Geo*_*rge 8

除了回答/sf/answers/407648881/之外,更正确的方法是在时钟执行结束时使用OnResultExecuted覆盖.你什么时候回来

ActionResponse.Success(arr.Select(x => func(x)).ToJson();
Run Code Online (Sandbox Code Playgroud)

即一些懒惰的LINQ语句由于你的动作,它将动作"执行" 计算(函数'func'执行不会计入动作执行时间).我有这个讨厌的错误,无法弄清楚为什么我的动作"执行时间"是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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)