Frage

Ich verstehe die Vorteile von StringBuilder.

Aber wenn ich will, verketten von 2 strings, dann nehme ich an, dass es besser (schneller), es zu tun, ohne StringBuilder.Ist das richtig?

An welchem Punkt (Anzahl der strings) es wird besser, verwenden Sie StringBuilder?

War es hilfreich?

Lösung

Ich herzlich empfehlen, Sie zu Lesen Die Traurige Tragödie von Mikro-Optimierung Theater, von Jeff Atwood.

Es behandelt Einfache Verkettung vs.StringBuilder vs.andere Methoden.

Nun, wenn Sie wollen, um zu sehen, einige zahlen und Schaubilder, Folgen Sie dem link ;)

Andere Tipps

Aber wenn ich will, um concatinate 2 Saiten, dann nehme ich an, dass es besser (schneller), es zu tun, ohne StringBuilder.Ist das richtig?

Das ist in der Tat richtig, Sie herausfinden können, warum genau, erklärt sich sehr gut auf :

http://www.yoda.arachsys.com/csharp/stringbuilder.html

Zusammengefasst :wenn Sie können concatinate strings in einem Rutsch wie

var result = a + " " + b  + " " + c + ..

Sie sind besser dran ohne StringBuilder für nur eine Kopie gemacht wird (die Länge der resultierenden Zeichenfolge ist vorab berechnet.);

Für die Struktur wie

var result = a;
result  += " ";
result  += b;
result  += " ";
result  += c;
..

neue Objekte werden jedes mal erstellt, es gibt also sollten Sie erwägen, die Klasse StringBuilder.

Am Ende der Artikel fasst diese Faustregeln :

Faustregeln

Also, Wann sollten Sie verwenden Sie StringBuilder, und Wann sollten Sie die Verwendung der string - Verkettung von Operatoren?

  • Definitiv verwenden Sie StringBuilder, wenn Sie sind verkettet in einer nicht-trivialen loop - vor allem, wenn Sie nicht wissen, sicher (zur compile-Zeit), wie viele Iterationen, die Sie machen werden, durch die Schleife.Zum Beispiel liest eine Datei ein Zeichen zu einem Zeitpunkt, der Aufbau eines string-wie gehen Sie mit dem + = - operator ist möglicherweise von performance-Selbstmord.

  • Definitiv die Verkettung operator, wenn man (gut lesbar) geben Sie alles, was Bedürfnisse zu werden verkettet in einer Erklärung.(Wenn Sie eine Reihe von Dingen zu verketten, sollten den Aufruf String.Concat explizit - oder String.Beitreten, wenn Sie benötigen ein Trennzeichen.)

  • Haben Sie keine Angst zu brechen Literale bis in mehrere verkettete bits - der Ergebnis das gleiche sein.Sie können die Hilfe Lesbarkeit durch den Bruch eines langen literal in mehrere Linien, zum Beispiel mit kein Schaden für die Leistung.

  • Wenn Sie die Zwischenergebnisse die Verkettung für etwas andere als die Fütterung der nächsten iteration der Verkettung, die Klasse StringBuilder ist nicht gehen, um zu helfen Sie.Zum Beispiel, wenn bauen Sie einen vollständigen Namen des ersten name und letzten name, und fügen Sie dann eine Dritte information (die Spitznamen, vielleicht) zu Ende, Sie werden nur die Vorteile von StringBuilder wenn Sie brauchen nicht die (erste name + Letzte name) - Zeichenfolge für andere Zwecke (wie wir in dem Beispiel, das schafft ein Person-Objekt).

  • Wenn Sie nur ein paar Verkettungen zu tun, und Sie wirklich tun wollen in den separaten Anweisungen, es nicht eigentlich egal, welchen Weg Sie gehen.Die Weg ist effizienter wird davon abhängen, die Anzahl der Verkettungen der Größen der string einbezogen werden und in welcher Reihenfolge Sie sind verkettet in.Wenn Sie wirklich glauben Sie, dass der code ein performance-Engpass -, Profil-oder benchmark es in beide Richtungen.

System.String ist ein Objekt unveränderlich - es bedeutet, dass, wenn Sie ändern Ihren Inhalt zuweisen wird ein neues string-und das kostet Zeit (und in Erinnerung?).Verwendung von StringBuilder ändern Sie den tatsächlichen Inhalt des Objekts ohne Zuweisung eines neuen.

So verwenden Sie StringBuilder, wenn Sie brauchen, um viele änderungen an der Schnur.

Nicht wirklich...Sie sollte verwenden Sie StringBuilder, wenn Sie verketten große Streicher-oder Sie haben viele Verkettungen, wie in einer Schleife.

Es gibt keine definitive Antwort, nur Regeln-of-Daumen.Meine persönlichen Regeln gehen so etwas wie dieses:

  • Wenn die Verkettung in einer Schleife immer mit einem StringBuilder.
  • Wenn die Saiten sind groß, verwenden Sie immer eine StringBuilder.
  • Wenn die Verkettung code ist sauber und gut lesbar auf dem Bildschirm, dann ist es wohl ok.
    Wenn es nicht, verwenden Sie einen StringBuilder.

Paraphrase

Dann sollst du zählen bis drei, nicht mehr, nicht weniger.Drei ist die Zahl sollst du zählen, und die Zahl zu zählen sind drei.Vier sollst du nicht zählen, weder count thou two, außer, dass du dann gehen Sie zu drei.Sobald die Zahl drei, wobei die Dritte Reihe erreicht, dann lobbest thou thy Holy Hand Grenade of Antioch

Ich in der Regel die Verwendung von string-builder für jede code-block, der dazu führen würde, dass die Verkettung von drei oder mehr Saiten.

  • Wenn Sie verketten von strings in einer Schleife, sollten Sie erwägen, StringBuilder anstelle von regulären String
  • In Fall es ist eine einzige Verkettung, können Sie nicht sehen die Unterschied in der Ausführungszeit an alle

Hier ist eine einfache test-app, um den Punkt zu beweisen:

class Program
{
    static void Main(string[] args)
    {
        const int testLength = 30000;
        var StartTime = DateTime.Now;

        //TEST 1 - String
        StartTime = DateTime.Now;
        String tString = "test string";
        for (int i = 0; i < testLength; i++)
        {
            tString += i.ToString();
        }
        Console.WriteLine((DateTime.Now - StartTime).TotalMilliseconds.ToString());
        //result: 2000 ms

        //TEST 2 - StringBuilder
        StartTime = DateTime.Now;
        StringBuilder tSB = new StringBuilder("test string");
        for (int i = 0; i < testLength; i++)
        {
            tSB.Append(i.ToString());
        }
        Console.WriteLine((DateTime.Now - StartTime).TotalMilliseconds.ToString());
        //result: 4 ms

        Console.ReadLine();
    }
}

Ergebnisse:

  • 30'000 Iterationen

    • String - 2000 ms
    • StringBuilder - 4 ms
  • 1000 Iterationen

    • String - 2 ms
    • StringBuilder - 1 ms
  • 500 Iterationen

    • String - 0 ms
    • StringBuilder - 0 ms

Aber wenn ich will, verketten von 2 strings, dann nehme ich an, dass es besser und schneller zu tun, ohne StringBuilder.Ist das richtig?

Ja.Aber noch wichtiger ist, es ist weitaus mehr lesbar verwenden Sie eine Vanille String in solchen Situationen ist.Verwenden Sie es in einer Schleife, auf der anderen Seite, macht Sinn und kann auch so gut lesbar wie die Verkettung.

Ich würde vorsichtig sein, Faustregeln, cite bestimmten Nummern der Verkettung als ein Schwellenwert ist.Die Verwendung in loops (und loops) ist wahrscheinlich nur nützlich, Sie leichter zu merken und macht mehr Sinn.

So lange wie Sie können physisch geben Sie die Anzahl der Verkettungen (a + b + c,...) sollte es nicht einen großen Unterschied machen.N-squared (bei N = 10) ist eine 100-fache Verlangsamung, die sollte nicht so schlimm sein.

Das große problem ist, wenn Sie verketten, Hunderte von strings.Bei N=100, erhalten Sie eine 10000X mal Verlangsamung.Das ist ziemlich schlecht.

Ich glaube nicht, dass es eine feine Linie zwischen dem, Wann oder Wann nicht.Es sei denn natürlich, jemand hat einige umfangreiche Prüfungen gekommen, um mit dem Goldenen Bedingungen.

Für mich, ich will nicht verwenden Sie StringBuilder, wenn nur die Verkettung von 2 riesige strings.Wenn es eine Schleife mit einem undeterministic zählen, bin ich wahrscheinlich, auch wenn die Schleife ist zwar klein, zählt.

Eine einzelne Verkettung ist nicht Wert, mit einem StringBuilder.Ich habe in der Regel 5-Verkettungen werden als Faustregel.

Die StringBuilder Klasse stellt dem Entwickler eine Reihe von Methoden, erlaubt die manipulation der eine veränderbare Zeichenfolge, es kann verwendet werden, wenn Sie ändern möchten eine Zeichenfolge ohne ein neues Objekt erstellen, wodurch die overhead-oder Engpass Problem der normale String-Verkettung.

Mit der StringBuilder Klasse können die Leistung steigern, wenn das verketten vieler strings zusammen in einer Schleife.

Das folgende ist eine Liste von ein paar Operationen, die durchgeführt werden können, zum Bearbeiten von string mit StringBuilder-Klasse .NET

Append:Fügt Informationen am Ende der aktuellen StringBuilder.

AppendFormat:Ersetzt ein Formatbezeichner übergeben wird ein string mit formatiertem text.

Einfügen:Fügt eine Zeichenfolge oder ein Objekt in den angegebenen index des aktuellen StringBuilder.

Entfernen:Entfernt eine angegebene Anzahl von Zeichen ab der aktuellen StringBuilder.

Ersetzen:Ersetzt ein angegebenes Zeichen an einem bestimmten index.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top