Dienstag 8. März 2011 von tommi
Aktuell arbeite ich in einer Solution mit 43 Projekten. Das Kompilieren dauert da ca. 1 Minute.
Wie über den Taskmanager ersichtlich, waren die Prozessoren nur mit 12 % belastet. Also dachte ich mir das die HD der Flaschenhals ist und kurzerhand eine Curcial C300 SSD verbaut. Erschrocken musste ich feststellen das sich beim kompilieren nicht viel getan hat.
Zur gleichen Thematik hat jemand einen Eintrag im C# Forum erstellt der mich dann auf die richtige Spur brachte.
Des Rätsels Lösung: Der Standard Build Prozess ist nicht auf MultiCore ausgelegt. Dies kann man mit MSBuild /m explizit durchführen. Bei mir hat sich die Buildgeschwindigkeit verdoppelt!

Wie das genau mit MSBuild funktioniert erfährt man hier. Wie sich das Ganze in VS integrieren lässt ist hier nachzulesen.
Mehr zum Thema MS-Build gibt es am 17.03.2011 bei unserer DevGroup Frankfurt.
Kategorie: Allgemein |
1 Kommentar »
Mittwoch 2. März 2011 von tommi
Hin und wieder stösst man im Code auf String.Empty das gern statt “” genutzt wird. Auf Nachfrage teilte mir einer meiner Kollegen mit :
”Besser immer String.Empty benutzen – dies ist Performanter und String.Empty kann Betriebssystemspezifisch vom Compiler auf einen leeren String gesetzt werden”
Da dachte ich mir: Klingt komisch – isses auch.
Soviel zur Vorgeschichte. Nun zu den Ergebnissen meiner Nachforschungen und Experimente.
In dem statischen Konstruktor der String Klasse wird der Empty Wert auch nur auf “” gesetzt. Also nix besonderes.
1 static String()
2 {
3 Empty = "";
4 }
Das bedeutet somit das String.Empty erst zur Laufzeit vom Framework gesetzt wird. Das hat wiederum Konsequenzen für die Verwendung in einem Switch da dieser nur auf Konstante Werte auswerten kann:

Hier kommt man also nicht drum herum “” zu verwenden.
Jetzt könnte man ja meinen: Ok statt dem Switch kann ich auch das IF Statement verwenden – da kann ich dann schön String.Empty einsetzen. Klar, kann man machen. IF Statements können aber im Gegensatz zu Switch einen deutlichen Performaceverlust führen denn komplexte Switches werden intern als Dictionary implementiert die je nach Situation sehr viel Performanter sein können als IF Conditions.
Aber gibt es im Allgemeinen einen Geschwindigkeitsunterschied? Dazu ein kleines Experiment
1 Stopwatch stopWatch = new Stopwatch();
2 stopWatch.Start();
3 for (long i = 0; i < 3000000000; i++)
4 {
5 //Dauer: 6076
6 //if ("" == null) { throw new System.Exception(); }
7
8 //Dauer: 8150 - langsamer
9 if (string.Empty == null) { throw new System.Exception(); }
10 }
11 stopWatch.Stop();
12 Console.WriteLine(stopWatch.ElapsedMilliseconds.ToString() );
13 Console.ReadLine();
Wie die folgende Analyse zeigt, kann der Compiler den Vergleich mit “” komplett entfernen.

Also unter dem Strich lasse ich mich zu der Aussage verleiten das String.Empty in weniger Fällen nutzbar (Switch) und auch langsamer ist als das String Literal “”.
Kategorie: Allgemein |
Keine Kommentare »