Samstag, 29. August 2009

Langsame Codestränge in der Liveumgebung identifizieren

Zur Entwicklungszeit werden zeitintesive Blöcke in der Regel relativ einfach erkannt, man will aber öfters die Performance auch im Livebetrieb testen.
Vor allem Schreib- und Lesezugriffe aufs Dateisystem oder Datenbankoperationen sind predestiniert für solche Zeitmessungen.

Folgende Klasse kann verwendet werden um die Ausführungsgeschwindigkeit eines Blocks zu messen.

Die IDisposable Schnittstelle stellt sicher, dass die Dispose Methode des Objektes explizit geschrieben, bei der Zerstörung des Objektes ausgeführt wird und dabei Resourcen freigegeben werden.

   1:  public class TimeSpanLogger:IDisposable
   2:  {
   3:      public void Dispose()
   4:      {
   5:   
   6:      }
   7:  }

Im Kostruktur wird die Kennzeichnung des Messblocks weitergereicht und als private Variable festgehalten.

   1:  public TimeSpanLogger(string tag)
   2:  {
   3:      Tag = tag;
   4:  }

Bei der Zerstörung des Objektes wird die Zeit seit der Erstellung des Objektes gemessen und ins Ausgabefenster geschrieben. Für die Ausgabe können Loggingkomponenten wie zb. die Application Blocks der Enterprise Library verwendet werden.

   1:  TimeSpan ts = DateTime.Now - StartTime;
   2:   
   3:  //Debug.WriteLine ersetzen
   4:  System.Diagnostics.Debug.WriteLine(string.Concat(DateTime.Now.ToString(),
   5:  "\t", Tag, "\t", ts.TotalSeconds.ToString()));

Hier als Ganzes:

   1:  public class TimeSpanLogger:IDisposable
   2:  {
   3:      private string Tag = string.Empty;
   4:      private DateTime StartTime = DateTime.Now;
   5:   
   6:      public TimeSpanLogger(string tag)
   7:      {
   8:          Tag = tag;
   9:      }
  10:   
  11:   
  12:      public void Dispose()
  13:      {
  14:          TimeSpan ts = DateTime.Now - StartTime;
  15:   
  16:          System.Diagnostics.Debug.WriteLine(
  17:              string.Concat(DateTime.Now.ToString(),"\t", 
  18:              Tag, "\t", ts.TotalSeconds.ToString()));
  19:      }
  20:  }

Und so wirds angewandt:

   1:  using (new TimeSpanLogger("testfunc"))
   2:  {
   3:      //Some Operations
   4:  }

Beim verlassen des Blockcontexts wird die Klasse TimeSpanLogger terminiert und die Methode Dispose implizit ausgeführt.

Keine Kommentare:

Kommentar veröffentlichen