测量ASP的性能.asp.net MVC 3
本文关键字:net MVC asp 性能 ASP 测量 | 更新日期: 2023-09-27 17:53:49
我在ASP中构建了一个JSON服务。. NET MVC 3,我希望能够测量我的应用程序中动作的执行时间(我希望它能自动记录缓慢的动作)。
因此这看起来很棒;http://coderjournal.com/2010/10/timing-the-execution-time-of-your-mvc-actions/(在堆栈溢出的地方也提到过)
问题是,我得到的测量必须是错误的从这种方法;我添加了另一个秒表,它从动作的第一件事开始,并在返回之前停止。
的例子:
- 方法中的秒表=> 10ms(这里省略了序列化到json,所以我可以理解它比现实短)
- 秒表属性(以上代码)=> 676ms
- Firefox显示请求耗时=> 70ms
我相信firefox在这里有正确的时间(但它包括下载,所以它有点大),但我想了解为什么属性代码不起作用,对此有什么想法吗?
这可能不是它显示长执行时间的原因,但是当您一次有多个请求时,该属性将无法正确地与mvc 3一起工作。
在以前版本的ASP。净MVC,每个请求都创建动作过滤器除了少数情况。这种行为从来都不是一个保证的行为,但是仅仅是实现细节和过滤器的契约是认为他们是无国籍的。在ASP。网MVC 3,过滤器被缓存的更多积极。因此,任何习俗操作过滤器不正确地存储实例状态可能被破坏。
我建议在OnActionExecuting
中实例化新的秒表并将其保存到HttpContext.Current.Items
-然后您可以在OnActionExecuted
中检索它并打印出结果。
除了回答https://stackoverflow.com/a/5823555/504082之外,更正确的方法是在时钟执行结束时使用onresultperformed覆盖。当你返回
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
属性