Welcome to AspAdvice Sign in | Join | Help

manik.net

alles über c# / microsoft asp.net und viel, viel mehr
C# und ASP.Net Performance Optimierungen

Hier mal in Stichworten ein paar Grundsätze die man beim Entwicklen beachten sollte, wenn Laufzeit-Performance eine Rolle spielt:

C# Performance Optimierungen:

  • Lieber wenig große wie viel kleine Assemblys
  • „sealed“-Klassen wann immer möglich bei geerbten Typen mit vielen virtuellen Funktionen. Die virtuellen aufrufe werden dann „inline“ teil der Klasse.
  • „Equals“ überschreiben bei Value-Types  ( struct valuetype ) , vermeidet Reflektionskosten
  • Propertys sind teurer wie öffentliche Attribute. Bei einfach switches eher öffentliche Attribute verwenden (z.B: public bool Debug).
  • Boxing vermeiden! Fixe Typen wann es geht.
  • for anstatt foreach
  • so wenig funktionsaufruf in einem loop wie möglich, d.h. auch rekursive Aufrufe vermeiden - auch Property zugriffe sollte so gut wie möglich vermieden werden 
  •  „jagged arrays“ anstelle von multidimensionalen arrays.
    string[][] jaggedArray = new string[2][];
    jaggedArray[0] = new string[4];
    jaggedArray[1] = new string[1];
    jaggedArray[0][1] = “performance!”;

    MSIL kann eindimensionale Arrays besser optimieren wie mehrdimensionale.
    Auf MSIL ebene sieht man den unterschied:

    int [,] secondarr = new int[1, 2];
    secondarr[0, 0] = 40;

    MSIL:

    IL_0029: ldc.i4.s   40
    IL_002b: call instance void int32[0...,0...]::Set(int32, int32,in32)

    Mit einem Jaggedarray sieht das ganze dann auf MSIL so aus:

    IL_001c:  ldc.i4.s   40
    IL_001e:  stelem.i4

    stelem = „store an element“

    Bei mehrdimensionalen Arrays wird der ganze „Generic Type“-Kram also betrieben was einiges an Overhead erzeugt.
  • Bei string vergleichen wo Groß-/Kleinschreibung ignoriert werden soll CompareTo anstatt a.ToLower()==b.ToLower() da die ToLower operation zusätzliche strings erzeugt
  • (try/catch)-blöcke vermeiden, lieber den Code sicher schreiben (null checks etc.) und gut prüfen


ASP .Net Optimierungen:

  • Roundtrips vermeiden: Server.Transfer anstelle von Response.Redirect  (es wird kein Responseheader zurück geschickt der einen Redirect auf dem Clienten verursacht, d.h. die Url im Browser ändert sich auch nicht, allerdings spart man dadurch einen Roundtrip)
  • Lange Control.ID zuweisungen vermeiden
  • Tiefe Control Schachtelungen vermeiden
  • Viewstate ausschalten wenn nicht benötigt, am besten nicht per Control sondern per page
    wann?
    -> die seite macht kein postback mit informationen verschiedener controls (5 textboxen auf einer seite)
    -> controls haben keinen dynamischen inhalt oder werden mit jedem postback neu befüllt
  • Page.IsPostBack property verwenden um eine mehrfach initialisierung zu vermeiden
  • Page.DataBind() vermeiden -> jedes control das DataBinding unterstützt wird dann gebundend. -> notwendige controls einzeln binden
  • Eval(##) vermeiden lieber explizit Casten und Daten von hand auswerten, spart Reflektionskosten

     

Sponsor
Posted: Friday, April 18, 2008 3:30 PM by manik

Comments

No Comments

Leave a Comment

(required) 

(required) 

(optional)

(required) 

Enter the code you see below

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS