Strings schnell aneinanderhängen

Ich komme aus der Java-Welt und dort hieß es immer, wenn man mehrere Strings aneinander hängen will, muss man StringBuffer/StringBuilder benutzen. Ich habe dies jetzt mal in .Net untersucht und musste feststellen, dass es etwas mehr ist.

In .Net habe ich jetzt einige Optimierungen getestet und mit dem IL-Disassembler angesehen. Und es kam heraus, dass der folgende Ausdruck am schnellsten ist. Außerdem ist er lesbarer als eine vergleichbare Version mit einem StringBuilder.

Dim strHallo as String = "Hallo"
Dim strResult as String

strResult = "<" & strHallo & ">"

Der Compiler optimiert diesen Code, sodass die Funktion String.Concat() aufgerufen wird.  Dabei werden die passenden Überladungen aufgerufen. Bis zu 4 Argumente als Strings. Darüber hinaus wird ein String-Array erstellt, gefüllt und übergeben. Ein weiterer positiver Effekt ist, dass bekannte Strings die verbunden werden sollen, bereits vom Compiler zusammengefügt werden.

Der folgende Code wird allerdings nicht optimal ausgeführt, da auch dieser Code auf String.Concat() für 2 Strings zurückgeführt wird. Der Code benötigte bei mir auf meinem Laptop ca. 17 Sekunden.

Dim strResult As String = ""
For i As Integer = 0 To 100000
    strResult &= "<"
Next i

Der nachfolgende Code mit einem StringBuilder benötigte weniger als 10 Millisekunden und ist auch verständlich.

Dim strResult As String = ""
Dim sb As New StringBuilder()

For i As Integer = 0 To 100000
    sb.Append("<")
Next i

strResult = sb.ToString()

Fassen wir das Ganze zusammen:

  • Soll eine feste Zahl an Strings aneinander gehangen werden, dann kann man den &-Operator benutzen.
  • Konstante Strings werden vom Compiler zusammengefügt.
  • Soll ein String mit einer Schleife zusammengebaut werden, so empfiehlt sich die Benutzung eines StringBuilder!
Advertisements

Msdn TechTalk: Clever Unterwegs mit Windows 7

Ich war heute Abend bei Microsoft zum kostenlosen TechTalk, der wie im Titel benannt ist. Der Vortragene war Peter Kirchner. (http://blogs.msdn.com/b/pkirchner/). Insgesamt ein sehr interessanter Abend mit interessanten Beispielen. Alle wichtigen Themen von Windows 7 wurden angesprochen. Auch welche, die nicht direkt für Developer gedacht, aber trotzdem interessant sind. Solche kostenlosen TechTalks sind toll. Ich würde immer wieder hingehen.

Test der codierten UI

Als Student kann man tolle Programme ausprobieren. Ich wollte gerade einen „Test der codierten UI“, also einen aufgezeichneten Oberflächentest ausprobieren. Die Erstellung des Tests lief wunderbar, aber der generierte Test ließ sich nicht kompilieren. Ich habe eine weile gebraucht um zu verstehen, warum nicht. Eine Referenz konnte nicht aufgelöst werden, weshalb die Importe für diesen Test als fehlerhaft markiert wurden. Nach etwas suchen fand ich raus, dass diese GUI-Tests neu im .Net-Framework 4 sind.
Der Fehler war nun gefunden. In den Projekteinstellungen unter Kompilieren -> Erweiterte Kompilieroptionen war als Zielframework 3.5 angegeben, welches die Referenzen nicht besitzt. So einfach kann das manchmal sein.
Jetzt klappt es und sieht sehr nützlich aus. Demnächst kann ich evtl. Zeit sparen, indem ich Tests schreibe und ausführe anstatt manuell rumzuklickern.

Google App Engine

In einem Seminar zum Thema Cloud-Computing habe ich mich mit der Google App Engine beschäftigt.

In der Grundversion ist diese kostenlos und bietet schon einige Funktionen. Ich habe es ausprobiert und ein paar Experimente erstellt. Zum Beispiel einen Imageresizer, dem man eine URL übergibt, an der ein Bild liegt, welches dann verkleinert zurückgeliefert wird. Wer einen Platz sucht um seine Java basierte Seite zu hosten, sollte sich die App Engine mal ansehen. Auch Python wird als Programmiersprache unterstützt.

Hier die Links:
appspot.com – Die AppEngine
glow-soft.appspot.com – Meine Experimente

Sehr interessantes PDF zum Thema Ressourcen schonen

Ich habe gerade dieses PDF gelesen: http://www.veloursnebel.de/Artikel/Ressourcen_schonen.pdf

Es ist sehr interessant und behandelt die Frage, wie man Datenbankverbindungen in .Net behandeln sollte. Meine Hauptfrage, weshalb ich momentan suche ist: Sollte man in einer Desktopanwendung die Datenbankverbindung einmal öffnen und dann wiederverwenden, oder sie jedesmal öffnen und schließen. Was ist sauberer? Was ist Performanter? Und lohnt sich der Performancegewinn überhaupt?

Ein Fakt, der in dem PDF genannt wird ist, dass das .Net Framework standardmäßig ConnectionPooling einsetzt. Das heißt, es wird eine Anzahl Verbindungen geöffnet und diese werden geteilt. Dadurch geht das Öffnen einer Datenbankverbindung schneller. Beim Schließen der Verbindung wird diese nur freigegeben.

Ein weiterer Punkt ist, dass man sauberer Programmieren kann, wenn man die Verbindung jedesmal wieder schließt. Man kann und sollte das Using Schlüsselwort nutzen, um sicherzustellen, dass die Verbindung geschlossen wird. Im Beispiel im PDF kann leicht sehen, wie Using funktioniert. Ich möchte das Beispiel hier nochmal zeigen, aber etwas abändern. Der Autor hat sich auf die Datenbankverbindungen konzentriert. Der Datenbankbefehl und der DataReader werden allerdings immernoch nach dem alten Muster mit Close() geschlossen. Konsequenterweise, um alle Ressourcen freizugeben, sollte man meiner Meinung nach auch hier ein Using einsetzen.

using (OdbcConnection sqlConn = new OdbcConnection()){
    using (sqlCmd = new OdbcCommand(sql, sqlConn)){
        sqlConn.Open();
        using (OdbcDataReader sqlReader = sqlCmd.ExecuteReader()){
            while (sqlReader.Read()){
                Console.WriteLine(sqlReader["ID"]);
            }
       }
}

Der Vorteil des hier gezeigten Beispiels ist, dass alle Ressourcen wieder geschlossen werden. Ein Nachteil ist, wenn man using nicht wirklich kennt, dann sieht man nicht direkt, dass diese geschlossen werden. Außerdem wird der Code durch die zusätzlichen Blöcke weit eingerückt.

Was meint ihr?