Performance -Problem beim wstring
-
Ich baue den XML-String ganz normal zusammen.
std::wstring sBlob; // für die Klasse global sBlob.reserve( p_lGroesse ); void addString ( std::wstring sText ) { sBlob= sBlob + sText; }Und das ist viel zu langsam.
Mfg , Elke
-
Wenn der String sehr lang ist, dann könntest du mit
wstring wstr; wstr.reserve(10000); // oder noch mehrdir vorher genug Speicher reservieren (damit nicht immer wieder intern umkopiert werden muß).
Ansonsten zeig mal ein bißchen Code...
-
Außerdem solltest du statt "sBlob = sBlob + sText;" lieber "sBlob += sText;" verwenden - dein Code erzeugt nämlich unnötig viele Kopien der Strings, die angelegt, gefüllt und wieder freigegeben werden müssen.
(PS: Und übergib sText lieber als "const wstring&")
-
Außerdem könntest du den Parameter als const reference übergeben, dann wird er nicht kopiert.
void addString ( const std::wstring& sText );
-
Hallo,
erstmal solltest du sText als Referenz übergeben. Damit sparst du dir schonmal eine Kopie. Eine weitere Kopie kannst du dir sparen, wenn du den += Operator benutzt. Also sBlob += sText;
-
Ich dachte , dass ich viellecht den wstring als wchar zusammenbauen
soll. Weiß aber nicht ob es damit schneller geht
Mfg ,
Elke
-
Kann mir ehrlich gesagt nicht vorstellen, dass es lange dauert einen Text anzufügen.
Wie kommst Du darauf, das es daran liegt?
-
ich habe den String schon als Referenz übergeben , nur im Beispiel nicht angegegeben.
Das mit sBlob +=sText muss ich noch testen.
Danke !
Mfg , Elke
-
Hallo templäd ,
ich habe unsere lauffähige Anwendung vor Kurzem auf den wstring umgestellt.
Und wenn ich die Zeiten vergleiche , dann ist das Programm richtig langsam geworden. Es kann nur am wstring liegen. In der "nicht umgestellten" Anwendung haben wir den String allerdings als char zusammengebaut.
Mfg , Elke
-
Naja, du solltest auch bedenken, dass bei einem wstring mehr Daten gelesen und geschrieben werden müssen, da wchar_t idR mehr Speicher verbraucht als char. Unter Windows ist char zB 8 Bit und wchar_t 16 Bit. Solange deine Anwendung bei so einer Konstellation also nicht mehr als doppelt so langsam (was der Worst-Case wäre) läuft wie vorher, würde ich mir noch keine Sorgen machen.
-
Hallo groovemaster,
das ist ja das Problem . Die Anwendung ist ums Zehnfache langsamer

Mfg, Elke
-
Hmmm ... dann würde ich empfehlen, einen Profiler zu benutzen, falls das möglich ist. Evtl. lässt sich damit herausfinden, wo zuviel Zeit gebraucht wird.
-
Hallo CStoll,
vielen Dank für deinen Tipp:
Das mitsBlob += sTextstatt
sBlob = sBlob + sTextEs hat wahre Wunder bewirkt ! Die Laufzeit hat sich von einer Stunde auf 3 Min.
verkürzt !Wird bei der zweiten Schreibweise immer eine neue Instanz erzeugt und der Inhalt reinkopiert ?
Danke !
Viele Grüße,
Elke
-
Nunja, zweitere Variante muss auf jeden Fall
a) Neuen, temporären String erzeugen, Speicher allokieren
b) In diesen neuen String die beiden Teilstrings kopieren
c) temporären String in Ergebnis kopierenErstere ist in der Lage den Faktor der Reserve auszunutzen
a) Schauen ob Kapazität kleiner als neue Länge
a2) Nur wenn ja, neuen Speicher allokieren
b) Teilstring an bisherigen String anhängenEs wird also in c) die Kopie gespart und in a) evtl. vorhandener Reservespeicher ausgenutzt.
EDIT:
Dreher korrigiert
-
Was ist mit der append()-Methode?
-
Artchi schrieb:
Was ist mit der append()-Methode?
äquivalent zu +=