2009-04-03 20 views
8

P: ¿Cómo calculo el tiempo total que lleva renderizar una página MVC y mostrar la hora en la página maestra?Tiempo de procesamiento de páginas en MVC

en forma de banda Asp.net he creado una clase de página Base de este modo:

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"; 
     } 
    }  
} 

me permitiría llamar al método en mi página maestra de este modo:

<div id="performance"> 
    <% =PageRenderTime %> 
</div> 

Q: ¿Cómo ¿Logré lo mismo con MVC Framework?

P: ¿Con el marco MVC dónde configuro la hora de inicio cuando se crea una página por primera vez?

+1

No es una respuesta a su pregunta, pero no echar un vistazo a System.Diagnostics.Stopwatch cuando se quiere calcular los intervalos de ese tipo. Consulte http://stackoverflow.com/questions/28637/is-datetime-now-the-best-way-to-measure-a-functions-performance –

Respuesta

1

Crea un controlador base y haz que tus controladores se deriven de él. Establezca su hora de inicio en el constructor y anule Dispose() y coloque el cálculo del tiempo total allí. Esto debería darle un extremo a otro en toda la vida de la acción. Dado que Controller implementa IDisposable, supongo que el motor de renderización lo eliminará una vez que se haya calculado el resultado y no tendrá que esperar a que se recoja basura. Si mi suposición resulta ser incorrecta, podría usar OnResultExecuted() en su lugar.

EDIT: Para obtener el tiempo de renderizado en la página sería relativamente difícil porque por definición la página no se puede hacer hasta que su tiempo se coloca en la página y no puede tener el tiempo hasta la página está hecho renderizado. Sin embargo, podría escribir el tiempo de renderizado en la sesión y luego usar AJAX para volver y obtener el tiempo de renderización para visualizarlo más tarde. Es posible que pueda aproximarlo poniendo la hora de inicio en ViewData y calculando el tiempo de renderización en la propia Vista. Es posible que desee intentar registrar el tiempo de renderizado y hacer la aproximación de la vista y ver qué tan cerca está.

Este código podría usarse para registrar el tiempo de renderizado.

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 ... 
    } 
} 
2

que probablemente invalidar los métodos OnActionExecutingOnActionExecuted y en la clase del controlador.

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 
    } 
} 
+0

Creo que esto solo le dará tiempo para configurar los datos de los resultados , en realidad no representa la página. Para el tiempo de renderizado, el OnResultExecuted, que se invoca después de que se haya ejecutado ActionResult, es más preciso. – tvanfosson

+0

Cierto, pero no creo que pueda modificar ViewData una vez que se haya ejecutado el resultado, lo que significa que no hay forma de mostrar el tiempo de ejecución en la página. Corrígeme si me equivoco, sin embargo. –

+3

Sí. Eso sería mi entendimiento, también. Pero podría almacenar el tiempo y recuperarlo a través de AJAX si necesita obtener una medida precisa. Personalmente, lo registraría y no me preocuparía conseguirlo en la página. – tvanfosson

4

entra en tu web.config y asegúrese de que usted tiene ...

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

A continuación, puede Goto http://.../trace.axd y ver cada solicitud realizada.

Luego desea buscar debajo de la columna De los primeros y el último es el tiempo que le tomó a la página (lado del servidor).

Ejemplo ...

aspx.page End Render 0.06121112 0.005297 

61,2 ms para procesar la página.

Si está buscando código de tiempo o quiere hacer algunos diagnósticos manualmente, quiere usar la clase System.Diagnostics.Stopwatch not DateTime.

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

Gracias ... Realmente me gustaría ver el tiempo de procesamiento de la página en el pie de página principal. – TonyAbell

+0

Puede usar el objeto Trace y hacer Trace.Write() para escribir en la salida de rastreo y lo agregará en la lista de eventos y tiempos de procesamiento, etc. –

+0

Está pidiendo el tiempo que lleva renderizar (requisito por cliente) ?), lo que sugieres es mostrar todo tipo de información de depuración que él podría no querer ver. – GvS

Cuestiones relacionadas