Ist stringstream besser als der String-Operator '+' für die Verkettung von String-Objekten?

8

Zum Beispiel habe ich zwei String-Objekte: string str_1, str_2. Ich möchte mit ihnen verketten. Ich kann zwei Methoden verwenden: Methode 1:

%Vor%

Methode 2:

%Vor%

Da der Puffer der Zeichenfolge schreibgeschützt ist, wird der Puffer beim Ändern des Zeichenfolgenobjekts zerstört und ein neuer erstellt, um neuen Inhalt zu speichern. Also Methode 1 ist besser als Methode 2? Ist mein Verständnis richtig?

    
cwfighter 15.05.2015, 07:43
quelle

3 Antworten

8

stringstreams sind komplexe Objekte im Vergleich zu einfachen Strings. Immer wenn Sie Methode 1 verwenden, muss ein stringstream erstellt und später zerstört werden. Wenn Sie dies Millionen von Zeit tun, wird der Overhead nicht vernachlässigbar sein.

Das scheinbar einfache ss << str_1 << str_2 ist tatsächlich äquivalent zu std::operator<<(sst::operator<<(ss, str_1), str_2); , das nicht für die Speicherverkettung optimiert ist, sondern für alle Streams .

Ich habe einen kleinen Benchmark gemacht:

  • Im Debug-Modus ist Methode 2 fast doppelt so schnell wie Methode1.

  • In optimiertem Build (Überprüfung in der Assembler-Datei, dass nichts weg optimiert wurde), ist es mehr als 27-mal schneller.

Christophe 15.05.2015, 09:01
quelle
0
  • Methode 2 ist besser als deine Situation hier. Da es eine bessere Lesbarkeit und Zeit kostet weniger für das Ablehnen der stringstream obj Erstellung.
  • Aber ich empfehle dringend, Format für bessere Lesbarkeit zu verwenden & amp; Wartung, anstelle von "+" oder andere String-Verkettung.
ybdesire 15.05.2015 08:25
quelle
0

Thans für alle. Vielleicht war ich ein bisschen faul. Jetzt habe ich den Codetest gegeben.

Test 1: 158.751ms, so lang, mein Gott!

%Vor%

Test 2: 31.1946ms, am schnellsten!

%Vor%

test 3: benutze boost :: filesystem :: pfad 35.1769ms, auch eine gute wahl

%Vor%     
cwfighter 15.05.2015 09:55
quelle

Tags und Links