2009-10-24 7 views
1

J'ai une page asp.net normale contenant du code dont je veux mesurer le temps d'exécution. J'ai créé une classe d'aide très basique à cette fin:Mesure du temps dans la page ASP.NET

public class Timing 
{ 
    private long m_ticksBefore; 
    private long m_ticksAfter; 

    public void Before() 
    { 
     m_ticksBefore = DateTime.Now.Ticks; 
    } 

    public void After() 
    { 
     m_ticksAfter = DateTime.Now.Ticks; 
    } 

    public void TraceTime(string note) 
    { 
     TimeSpan span = new TimeSpan(m_ticksAfter - m_ticksBefore); 
     System.Diagnostics.Trace.Write(string.Format("\n...Timing for {0}...\nTicks: \t{1}\nMilliseconds: \t{2}\nSeconds: \t{3}\n..................", note, span.Ticks, span.TotalMilliseconds, span.TotalSeconds)); 
    } 
} 

J'instancier un nouvel objet de synchronisation et enveloppez le code que je veux suivre avec le Avant() et après des méthodes et enfin appeler la méthode TraceTime() dans afin de sortir le résultat dans la fenêtre de sortie de l'IDE. La chose étrange est que la première requête à la page aboutit à un résultat attendu d'environ 40 millisecondes, mais l'actualisation de la page (F5) me donne 0 ticks de temps d'exécution. Même exécuter la page avec de nouveaux paramètres forçant l'exécution de code différente dans la zone surveillée révèle un appartement 0.

Si je System.Diagnostics.StopWatch à la place j'obtenir des résultats beaucoup plus réalistes

Stopwatch watch1 = Stopwatch.StartNew(); 
//Some code to monitor 
watch1.Stop(); 
System.Diagnostics.Trace.Write(watch1.ElapsedTicks); 

À moi le code semble très similaire et je n'arrive pas à trouver pourquoi la première approche ne produit pas de résultats réalistes ...

Il semble y avoir une sorte de problème d'optimisation qui est effectué derrière la scène, mais je ne suis pas vraiment trouver. Peut-être est-ce dû à mon problème de timing personnel, c'est-à-dire au problème du coucher ...

Répondre

1

Bien que DateTime.Now semble avoir une résolution de 100ns, Windows ne fait que mettre à jour son horloge interne toutes les 15ms. Par conséquent, si votre code prend moins de 7,5 ms pour s'exécuter, il semblera n'avoir pris aucun temps, puisque vous devez attendre en moyenne 7,5 ms pour que DateTime.Now change.

Si vous avez besoin d'une synchronisation plus précise, vous pouvez (comme vous l'avez constaté) utiliser StopWatch. Cela utilise une API différente et plus précise pour obtenir des résultats.

EDIT La résolution MSDN documentation for DateTime.Now donne la résolution "environ 10 ms". L'API GetTickCount (qui utilise la même minuterie système) donne sa résolution "typiquement dans la plage de 10 millisecondes à 16 millisecondes".

Apparemment, il est dépendant du matériel - des systèmes à processeur unique sont généralement 10ms, les systèmes de traitement multiples sont généralement 15ms.

+0

Le problème est que le même codage prend 40ms dans une situation et 0 dans l'autre ... bien sûr, le code étant mesure peut réagir différemment dans un scénario de postback, mais il n'a pas mentionné. –

+0

Mon point est que cela ne prend pas réellement 0ms. C'est toujours une chute, mais ~ 40ms à <10ms est beaucoup plus plausible que ~ 40ms à 0ms. – stevemegson

+0

Je vois .. c'est vrai. –

0

Je ne rencontre pas le même problème que vous. je mets le code suivant sur un bouton événement click:

Timing timing = new Timing(); 
timing.Before(); 
for (int i = 0; i < 100; i++) 
    Thread.Sleep(1); 
timing.After(); 
// I altered TraceTime to receive a HttpResponse. 
timing.TraceTime("this is a note", this.Response); 

La réponse est toujours proche de:

... Le délai de c'est une note ... Tiques: 1000057 Millisecondes: 100,0057 secondes: 0,1000057 ..................

Peu importe si elle est un poste de retour, pas de retour après ... Si je rafraîchis la page ou non.

Comment utilisez-vous la classe Timing?

Modifier

Je mets également le code ci-dessus sur la page gestionnaire de charge et obtenu exactement les mêmes résultats. Peu importe qu'il s'agisse d'un post-back, d'un rafraîchissement ou autre.

Vous devez nous indiquer le contexte dans lequel l'erreur se produit.

+0

L'exactement la même façon que vous le faites dans votre exemple. –

+0

Le code est ajouté au gestionnaire de chargement de la page exactement comme dans votre exemple. La première fois que je clique sur la page en mode débogage, une valeur raisonnable s'affiche dans la fenêtre de sortie. Si je recharge la page (avec F5 ou ctrl + F5), j'obtiens 0 ticks. Son tout à fait bizarre ... –

+0

Désolé, j'ai essayé dur, mais je ne peux pas reproduire. –

Questions connexes