plusone

14. November 2011

Alles nur eine Sache der Performance - String vs StringBuilder

Hallo zusammen,

Projekte wachsen mit der Zeit. Irgendwann stellt euch die Frage, wie kann ich das Vorhandene verbessern? Oder ist es überhaupt notwendig?

Ich bin an der Stelle schon einige Male gewesen. Ich würde nur ungerne prozersorschwache Geräte von meine APP ausschließen, also habe ich angefangen das Kapitel über die Performance zu lesen und umzusetzten.
Das alleine reichte für meine Bedürfnisse nicht aus. Heute zeige ich euch, wir ihr bei Schleifen mehr Performance gewinnen könnt, solltet ihr mit Strings arbeiten.

Das kommende Beispiel bezieht sich auf das Erweitern von Strings.

Wir starten mit einem String und dieser wird im Laufe unserer Programmverlaufs erweitert.
Ihr könnt eurem String mit [StringVariable] += [neuerString] erweitern oder ihr nutzt einen StringBuilder.
Ihr habt doch eine dieser Möglichkeiten schon Mal genutzt, nicht wahr?


Ich habe diese Möglichkeiten im einfachen Test auf die Probe gestellt.
StringBuilder builder = new StringBuilder(40000);
String s = "";
final long startMillis = System.currentTimeMillis();

for (char i = 0; i < 5000; i++) {
     builder.append("tee time");
}

final long millis2 = System.currentTimeMillis();


for (int i = 0; i < 5000; i++) {
     s += "tee time";
}

final long lastMillist = System.currentTimeMillis();

Log.d("DEBUG", "first for: " + (millis2 - startMillis)
           + "; last for: " + (lastMillist - millis2));
Jeder Wissenschaftler würde diesen Test wegen der Ungenauigkeit und der Fehlerquellen in der Luft zerreisen, aber versucht das bei euch doch selbst!

Mein Ergebniss mit dem Defy(tm):
  • erste Zeitmessung im Millisekundenbereich
  • zweite Zeitmessung besagt einen zweistellige Sekunden!!!

Das Spricht für sich...
Ich schlage vor, ihr nutzt den +=-Operator nicht mehr für Strings ;)

regards
Alexander Fink

1 Kommentar:

Stefan Wienströer hat gesagt…

StringBuilder bringt nur Vorteile, wenn man wirklich viele Strings zusammenfügen muss. Für deine Test wäre es am schnellsten, wenn du das "tee time" einfach 5000 mal hintereinander schreibst und komplett in den String speicherst ;-)

Kommentar veröffentlichen