Asp.net - connaître le temps d'execution de sa page ou du chargement d'un objet

Soyez le premier à donner votre avis sur cette source.

Snippet vu 15 958 fois - Téléchargée 29 fois

Contenu du snippet

Dans le cadre de développement et surtout dans un but d'optimisation, il est très utile de connaître le temps de chargement de certains objets et de la page globale.

Pour la page, on va passer par une astuce fournie sur le site de C2I (http://www.c2i.fr/code.aspx?IDCode=359) que j'ai adapté pour mes besoins.

Tout d'abord il faudra modifier le fichier Global.asax.vb, ensuite ajouter le contrôle utilisateur (User control) fourni et modifier le Web.config pour faire en sorte qu'il soit visible ou non.

Source / Exemple :


' --------- Global.asax.vb ---------------------------

Imports System.Web
Imports System.Web.SessionState

' -----------------------------------------------------
Public Class Global
    Inherits System.Web.HttpApplication
    Private dTimeDeb As DateTime

....
    ' -----------------------------------------------------
    Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
        ' Se déclenche lorsque la session se termine
        Session.RemoveAll()
    End Sub
....
    ' -----------------------------------------------------
    Private Sub Global_PreRequestHandlerExecute(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.PreRequestHandlerExecute
        dTimeDeb = DateTime.Now
    End Sub

    ' -----------------------------------------------------
    Private Sub Global_PostRequestHandlerExecute(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.PostRequestHandlerExecute
        Session.Item("TempsExecutionPage") = DateTime.Now.Subtract(dTimeDeb).TotalMilliseconds.ToString
    End Sub
....
    ' -----------------------------------------------------
End Class

' ------------------------------------------------------
' Dans le fichier Web.Config 
...
<appSettings>
...
 <add key="AfficheStats" value="1"/>
 <!-- mettre 1 pour afficher les stats, 0 pour ne pas les afficher -->
...
</appSettings>

' ------------------------------------------------------
'Maintenant il suffit de poser (dans Visual Studio.NET) le User Control 
'dans la page voulue et dans le source de cette page 
'(disons toto.aspx et toto.aspx.vb) ajouter le code suivant.
' Nous allons tester le temps de chargement d'un Dataset (il faudra l'adapter à vos besoins)

' ------------------------------------------------------
' Fichier toto.ASPX
....
<%@ Register TagPrefix="uc1" TagName="AfficheStats" Src="AfficheStats.ascx" %>
....
<uc1:AfficheStats id="AfficheStats1" runat="server"></uc1:AfficheStats>
....

' ------------------------------------------------------
' Fichier toto.ASPX.VB
....
    Private dTimeDebSQL As DateTime
....

' On initialise la variable de temps
dTimeDebSQL = DateTime.Now
MonDataset = ... 'Chargement de mon Dataset

'On ajoute en mémoire la valeur et le texte de présentation du temps
Session.Item("TempsExecutionSQL") &= "Chargement de MonDataset : " & DateTime.Now.Subtract(dTimeDebSQL).TotalMilliseconds.ToString & " ms<BR>"
....

'On peut en ajouter autant que l'on veut suivre dans la page simplement en remettant le même bloc.

dTimeDebSQL = DateTime.Now
MonDataset2 = ... 'Chargement de mon Dataset

'On ajoute en mémoire la valeur et le texte de présentation du temps
Session.Item("TempsExecutionSQL") &= "Chargement de MonDataset2 : " & DateTime.Now.Subtract(dTimeDebSQL).TotalMilliseconds.ToString & " ms<BR>"
....

' ------------------------------------------------------
'Copie de la source pour le Fichier User Control : AfficheStats.ascx (et .vb)

<%@ Control Language="vb" AutoEventWireup="false" Codebehind="AfficheStats.ascx.vb" Inherits="MonProjet.AfficheStats" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
<asp:Panel id="Panel1" runat="server" style="RIGHT:0px;BOTTOM:0px;POSITION:absolute;HEIGHT:auto">
<table class="AfficheStat" width="300" cellSpacing="0" cellPadding="0" border="0">
 <tr width="100%">
  <td>Temps exécution Page :</td>
  <td><asp:Label id="LabelTempsExecPage" runat="server" Width="100%">Label</asp:Label></td>
 </tr>
 <tr>
  <td>Temps exécution Requette :</td>
  <TD><asp:Label id="LabelTempsExecRequette" runat="server" Width="100%">Label</asp:Label></TD>
 </tr>
</table>
</asp:Panel>

' ----------- AfficheStats.ascx.vb -----------------------------
Public MustInherit Class AfficheStats
    Inherits System.Web.UI.UserControl
    Protected WithEvents LabelTempsExecPage As System.Web.UI.WebControls.Label
    Protected WithEvents Panel1 As System.Web.UI.WebControls.Panel
    Protected WithEvents LabelTempsExecRequette As System.Web.UI.WebControls.Label

#Region " Code généré par le Concepteur Web Form "

    'Cet appel est requis par le Concepteur Web Form.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

    End Sub

    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        'CODEGEN : cet appel de méthode est requis par le Concepteur Web Form
        'Ne le modifiez pas en utilisant l'éditeur de code.
        InitializeComponent()
    End Sub

#End Region

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Dim AfficheStats As String = ConfigurationSettings.AppSettings("AfficheStats")

        If AfficheStats = 1 Then
            Panel1.Visible = True
            LabelTempsExecPage.Text = Session.Item("TempsExecutionPage") & " ms"
            LabelTempsExecRequette.Text = Session.Item("TempsExecutionSQL")
        Else
            Panel1.Visible = False
        End If

    End Sub

End Class
' ------------------------------------------------------

Conclusion :


Cet outil est très simple.

En revanche il faut prendre garde dans le cas de l'utilisation d'un Handler dans la page où on place ce User Control, en effet, le système des Handlers ne gère pas le chargement de la variable de session dans le Global.asax, ainsi la page ne fonctionnera pas et l'initialisation du timer de chargement de la page ne sera pas possible et surtout ca fait planter le Handler.

Il faut juste ne pas utiliser le calcul du temps global d'exécution de la page, en revanche celui de chaque objet se fait sans soucis.

-----------------------------
Bon coding.

Romelard Fabrice (Alias F___)

A voir également

Ajouter un commentaire Commentaires
Messages postés
7
Date d'inscription
vendredi 23 mai 2003
Statut
Membre
Dernière intervention
10 août 2006

.NET 2 propose une classe tres simple pour ce genre de choses (Stopwatch) dans System.Diagnostics.
http://msdn2.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

Ici un bout de code (C#) qui se passe de commentaire... ou presque

using System.Diagnostics;

public void MyFunction()
{
Stopwatch sw= new Stopwatch();
sw.Start();
////////////////////////
//'Code' a chronometrer
////////////////////////
sw.Stop();

long lngDuration = sw.ElapsedMilliseconds;
}
Messages postés
4
Date d'inscription
mercredi 13 avril 2005
Statut
Membre
Dernière intervention
18 août 2005

re bonjour,
je tappotais mon rapport de stage quand la solution m'éclata au grand jour (et oui comme dans les films ...). Bète je suis de ne pas y avoir pensé plus tôt tellement est simple la solution:

En faite il suffit de fixer la date de début de l'exécution de la page dans la session lors de l'évènement "Global_PreRequestHandlerExecute". Ainsi nous obtenons le début de la création de la page.
Et la fin de la création de celle ci, permettant tout de même de réécrire un élément sur cette dernière, n'est autre que l'évènement "pre_render".
Donc dans ce dernier évènement on récupère la date de début qui se trouve dans la session que l'on soustrait à "now" et on affiche le tout dans un champ text par exemple.
Certe ceci fausse un peu la vraie valeur car une fois la soustraction faite l'exécution de la page n'est pas réellement terminée mais bon l'affectation d'une valeur dans un champ text prend tellement peu de temps ...

Voili voilou !
bye
Messages postés
4
Date d'inscription
mercredi 13 avril 2005
Statut
Membre
Dernière intervention
18 août 2005

Bonjour,
Principe fort intéressant mais un problème survient alors de l'utilisation de la collection "session" pour relater le temps d'execution à la page:
l'évenement du global.asax "PostRequestHandlerExecute" se déroule après l'évenement "Page_Load" de la page renvoyée. Ainsi lors du premier chargement (appel du "page_load")la variable de session "TempsExecutionPage" n'existe pas, elle n'existera qu'apres avoir exécuté "PostRequestHandlerExecute", c'est à dire juste après. Deplus ceci engendre un décalage de l'information, on ne connait pas la durée d'execution de la page en cours mais seulement celui de la page précédente.

exemple:

* première requete
-page_load
session.item("TempsExecutionPage") égale à "rien"
donc affichage "rien"
-PostRequestHandlerExecute
session.item("TempsExecutionPage") = 0,32 ms (temps indicatif de chargement de la page de la premiere requete)

* seconde requete
-page_load
session.item("TempsExecutionPage") égale à 0,32 (temps de la premiere requete )
donc affichage 0,32
-PostRequestHandlerExecute
session.item("TempsExecutionPage") = 1.02 ms (temps indicatif de chargement de la page de la seconde requete)

* troisieme requete
-page_load
session.item("TempsExecutionPage") égale à 1.02 (temps de la seconde requete )
donc affichage 1.02
-PostRequestHandlerExecute
session.item("TempsExecutionPage") = 0.62 ms (temps indicatif de chargement de la page de la troisieme requete)

On affiche alors le temps de la page précédente à chaque fois ...

Pour remedier à cela il faudrait un évènement du global.asax qui s'excute juste avant le "pre_render" de la page...
Personnellement je n'ai pas trouvé ...
Domage l'idée était bonne ...
Bye
Messages postés
20
Date d'inscription
mercredi 26 mars 2003
Statut
Membre
Dernière intervention
27 mars 2009

Bonjour,

je viens de le tester, mais le temps ne s'affiche pas.
Est-ce qu'il y a possibilité d'avoir des exemples de pages dans un zip.
Merci d'avance

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.