2009-04-03 6 views
8

Q: Comment puis-je calculer le temps total nécessaire pour afficher une page MVC et afficher l'heure sur la page maître.Page Heure de rendu dans MVC

Dans Asp.net Web Form I créé une classe de page de base comme ceci:

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

Je voudrais donc appeler la méthode sur mon maître page comme ceci:

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

Q: Comment Je fais la même chose avec le Framework MVC?

Q: Avec le cadre MVC, où dois-je définir l'heure de début lorsqu'une page est créée?

+1

Pas une réponse à votre question, mais ne jetez un oeil à System.Diagnostics.Stopwatch quand vous voulez calculer des intervalles comme ça. Voir http://stackoverflow.com/questions/28637/is-datetime-now-the-best-way-to-measure-a-functions-performance –

Répondre

1

Créez un contrôleur de base et faites en dériver vos contrôleurs. Définissez votre heure de début dans le constructeur et remplacez Dispose() et placez le calcul du temps total à cet endroit. Cela devrait vous donner une fin de bout en bout sur toute la vie de l'action. Comme Controller implémente IDisposable, je suppose que le moteur de rendu le disposera une fois le résultat calculé et que vous ne devrez pas attendre la récupération de place. Si mon hypothèse s'avère incorrecte, vous pouvez utiliser OnResultExecuted() à la place. Pour obtenir le temps de rendu sur la page serait relativement difficile car par définition la page ne peut pas être rendue jusqu'à ce que votre temps soit mis sur la page et vous ne pouvez pas avoir le temps jusqu'à la page est fait le rendu. Vous pouvez, cependant, écrire le temps de rendu à la session, puis utiliser AJAX pour revenir et obtenir le temps de rendu pour l'affichage plus tard. Vous pourrez peut-être l'approximer en définissant l'heure de début dans ViewData et en calculant le temps de rendu dans la vue elle-même. Vous pouvez essayer de consigner le temps de rendu et faire l'approximation de la vue et voir à quel point il est proche.

Ce code pourrait être utilisé pour consigner l'heure du rendu.

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

je ne serais probablement passer outre les méthodes OnActionExecuting et OnActionExecuted sur la classe contrôleur.

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

Je pense que cela vous donnera seulement le temps de configurer les données de résultat , pas réellement rendre la page. Pour le temps de rendu, le OnResultExecuted, qui est invoqué après que le ActionResult a été exécuté est plus précis. – tvanfosson

+0

C'est vrai, mais je ne pense pas que vous puissiez modifier ViewData une fois que le résultat a été exécuté, ce qui signifie qu'il n'y a aucun moyen d'afficher l'heure d'exécution sur la page. Corrigez-moi si j'ai tort, cependant. –

+3

Oui. Ce serait ma compréhension, aussi. Mais vous pouvez stocker l'heure et la récupérer via AJAX si vous avez besoin d'une mesure précise. Personnellement, je voudrais le connecter et ne pas s'inquiéter de l'obtenir sur la page elle-même. – tvanfosson

4

Allez dans votre web.config et assurez-vous que vous avez ...

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

Ensuite, vous pouvez goto http://.../trace.axd et voir chaque demande faite.

alors vous voulez regarder dans la colonne et la toute dernière est le temps qu'il a fallu pour rendre la page (côté serveur) De premier (s).

... Exemple

aspx.page End Render 0.06121112 0.005297 

61,2 ms pour rendre la page.

Si vous cherchez à code temporel lui-même ou que vous voulez faire manuellement des diagnostics que vous souhaitez utiliser la classe System.Diagnostics.Stopwatch pas DateTime.

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

Merci ... Je voudrais vraiment voir l'heure de rendu de la page sur le pied de la page maître. – TonyAbell

+0

Vous pouvez utiliser l'objet Trace et faire Trace.Write() pour écrire dans la sortie de trace et l'ajouter dans la liste des événements et des temps de rendu, etc. –

+0

Il demande le temps de rendu (exigence du client) ?), ce que vous proposez est d'afficher toutes sortes d'informations de débogage qu'il pourrait ne pas vouloir voir. – GvS

Questions connexes