MVC中的页面渲染时间

时间:2009-04-03 01:45:34

标签: asp.net-mvc performance model-view-controller

问:如何计算呈现MVC页面并在母版页上显示时间所需的总时间。

在Asp.net Web表单中,我创建了一个基页类:

public class PageBase : System.Web.UI.Page
{      
    private DateTime startTime = DateTime.Now;
    private TimeSpan renderTime;   
    public DateTime StartTime
    {
        set { startTime = value; }
        get { return startTime; }
    }  
    public virtual string PageRenderTime
    {
        get
        {
            renderTime = DateTime.Now - startTime;
            return renderTime.Seconds + "." + renderTime.Milliseconds + " seconds";
        }
    }       
}

然后我会在我的母版页上调用该方法:

<div id="performance">
     <% =PageRenderTime %>
</div>
问:我如何使用MVC框架完成同样的事情?

问:使用MVC框架,我在哪里设置首次创建页面的开始时间?

4 个答案:

答案 0 :(得分:11)

执行此操作的最佳方法是计算请求时间。开始请求和结束请求.... 看看这篇伟大的帖子:

http://haacked.com/archive/2008/07/02/httpmodule-for-timing-requests.aspx

答案 1 :(得分:4)

进入你的web.config并确保你有......

<system.web>
    <trace enabled="true" localOnly="false" />
</system.web>

然后你可以转到http://.../trace.axd并查看每个请求。

然后你想看看From First(s)列,最后一个是渲染页面所花费的时间(服务器端)。

示例...

aspx.page   End Render  0.06121112  0.005297

61.2 ms来渲染页面。

如果您正在寻找时间代码本身,或者您想手动执行某些诊断,则需要使用System.Diagnostics.Stopwatch类而不是DateTime。

Stopwatch sw = Stopwatch.StartNew();
...
sw.Stop();
Trace.Write(sw.ElapsedMilliseconds);

答案 2 :(得分:2)

我可能会覆盖Controller类上的OnActionExecutingOnActionExecuted方法。

public class BaseController : Controller {
    // Called before the action is executed
    public override void OnActionExecuting(ActionExecutingContext ctx) {
        base.OnActionExecuting(ctx);
        // Start timing
    }

    // Called after the action is executed
    public override void OnActionExecuted(ActionExecutedContext ctx) {
        base.OnActionExecuted(ctx);
        // Stop timing
    }
}

答案 3 :(得分:1)

创建一个基本控制器并让控制器从中派生出来。在构造函数中设置开始时间并覆盖Dispose()并计算总时间。这应该让你在行动的整个生命周期中端到端。由于Controller实现了IDisposable,我假设渲染引擎会在计算结果后处理它,你不必等待垃圾收集。如果我的假设是错误的,你可以改用OnResultExecuted()。

编辑:要在页面上获取渲染时间会比较困难,因为根据定义,在您将时间放在页面上之前无法完成渲染,而您无法进行渲染页面完成渲染的时间。但是,您可以将渲染时间写入会话,然后使用AJAX返回并获取渲染时间以便稍后显示。您可以通过将开始时间放在ViewData中并在视图本身中计算渲染时间来近似它。您可能想尝试记录渲染时间并进行视图近似,看看它的接近程度。

此代码可用于记录渲染时间。

public class BaseController : Controller
{
   private DateTime StartTime { get; set; }
   public BaseController() : base()
   {
       StartTime = DateTime.Now;
   }

   public override void Dispose( bool disposing )
   {
       var totalTime = DateTime.Now - this.StartTime;
       ... write it out somewhere ...
   }
}