2009-04-03 5 views
8

D: Come faccio a calcolare il tempo totale necessario per eseguire il rendering di una pagina MVC e visualizzare l'ora sulla pagina principale.Tempo di rendering della pagina in MVC

In Form Web Asp.net ho creato una classe di pagina di base in questo 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"; 
     } 
    }  
} 

Vorrei poi richiamare il metodo sulla mia pagina master in questo modo:

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

D: Come fare Realizzo la stessa cosa con MVC Framework?

D: Con il framework MVC dove si imposta l'ora di inizio quando viene creata una pagina?

+1

Non una risposta alla tua domanda, ma non dare un'occhiata a System.Diagnostics.Stopwatch quando si desidera calcolare gli intervalli del genere. Vedi http://stackoverflow.com/questions/28637/is-datetime-now-the-best-way-to-measure-a-functions-performance –

risposta

1

Creare un controller di base e far derivare i controller. Imposta l'ora di inizio nel costruttore e ignora Dispose() e metti il ​​calcolo del tempo totale lì. Questo dovrebbe darti un end-to-end sull'intera vita dell'azione. Poiché Controller implementa IDisposable, presumo che il motore di rendering lo disponga dopo che il risultato è stato calcolato e non sarà necessario attendere la garbage collection. Se la mia ipotesi si rivelasse errata, potresti utilizzare OnResultExecuted().

EDIT: Per ottenere il tempo di rendering della pagina sarebbe relativamente difficile perché, per definizione, la pagina non può essere fatto di rendering fino a quando il tempo viene messo sulla pagina e non si può avere il tempo fino a quando la pagina è finito il rendering. Potresti, comunque, scrivere il tempo di rendering per la sessione, quindi utilizzare AJAX per tornare indietro e ottenere il tempo di rendering per la visualizzazione successiva. Potresti essere in grado di approssimarlo inserendo l'ora di inizio in ViewData e calcolando il tempo di rendering nella Vista stessa. Potresti provare a registrare il tempo di rendering e ad eseguire l'approssimazione della vista e vedere quanto è vicino.

Questo codice può essere utilizzato per registrare il tempo di rendering.

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

Io probabilmente ignorare le OnActionExecuting e OnActionExecuted metodi sulla classe Controller.

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

Penso che questo ti darà solo il tempo di impostare i dati dei risultati , in realtà non rende la pagina. Per il tempo di rendering, OnResultExecuted, che viene richiamato dopo l'esecuzione di ActionResult, è più accurato. – tvanfosson

+0

Vero, ma non penso che sia possibile modificare ViewData dopo che il risultato è stato eseguito, il che significa che non c'è modo di visualizzare il tempo di esecuzione sulla pagina. Correggimi se sbaglio, comunque. –

+3

Sì. Anche questa sarebbe la mia comprensione. Ma è possibile memorizzare il tempo e recuperarlo tramite AJAX se è necessario ottenere una misura accurata. Personalmente lo registrerei e non mi preoccuperei di averlo sulla pagina stessa. – tvanfosson

4

entra nella tua web.config e assicuratevi di avere ...

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

Quindi è possibile goto http://.../trace.axd e vedere ogni richiesta fatta.

Quindi si desidera cercare nella colonna From First (s) e l'ultimo è il tempo necessario per il rendering della pagina (lato server).

Esempio ...

aspx.page End Render 0.06121112 0.005297 

61,2 per eseguire il rendering della pagina.

Se si sta osservando il time code stesso o si desidera eseguire manualmente alcuni test diagnostici, si desidera utilizzare la classe System.Diagnostics.Stopwatch non DateTime.

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

Grazie ... Mi piacerebbe molto vedere il tempo di rendering della pagina sul piè di pagina della pagina principale. – TonyAbell

+0

È possibile utilizzare l'oggetto Trace e Trace.Write() per scrivere sull'output di traccia e lo aggiungerà all'elenco di eventi e tempi di rendering ecc. –

+0

Chiede il tempo necessario per il rendering (fabbisogno del cliente ?), quello che suggerisci sta visualizzando tutti i tipi di informazioni di debug che potrebbe non voler vedere. – GvS