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

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

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.