11

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

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

问题是我从这种方法中得到的测量结果一定是错误的;我添加了另一个秒表,它开始动作中的第一件事并在返回之前停止。

例子:

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

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

4

4 回答 4

16

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

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

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

于 2011-04-28T18:53:17.747 回答
8

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

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

即由于您的操作而导致的一些惰性 LINQ 语句,它将在操作“执行”计算(函数 'func' 执行将不计入操作执行时间)。我有这个讨厌的错误,无法弄清楚为什么我的动作“执行时间”是 100 毫秒,尽管网络请求执行 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());
        }
    }
}
于 2013-03-14T10:32:59.953 回答
1

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

于 2011-04-28T16:19:41.347 回答
0

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

于 2011-04-28T17:30:19.437 回答