CopyMemory -> Array durchlaufen
-
Hallo !
Bin mir jetzt nicht sicher aber in C++ werden meine ja nicht diese APIs benutzt. Trotzdem benötige ich einen Rat bezüglich Geschwindikeit.
Un zwar geht es um ein Array der Klasse String, das kopiert werden soll da es sich dynamisch Speicher belegen muss, bzw. zur Entwurfzeit unbekannt ist wieviel Informationen/Daten benötigt/gespeichert werden müssen.
Jetzt gibt es ja die Möglichkeit ein temporäres Array zu erstellen und alle Daten per for-Schleife zu kopieren, dann das Original Array zu vergrössern und die "altene" Daten aus dem Temp Array wieder einlesen.
Das dauert aber ...Ist es jetzt schneller diese per CopyMemory (API) zu tun oder gibt es vielleicht eine ganz andere und/oder schnellere Möglichkeit ???
Gruß Michael
-
Per for-Schleife?! Wenn du unbedingt Indexzugriff brauchst, nimm einen std::vector. Der macht die Sache zwar nicht schneller, aber leichter und sicherer. Dann ist das grundsätzliche Problem, dass vector::resize die Strings kopiert, anstatt sie zu bewegen. Eine ideale Lösung lässt sich ohne Spracherweiterungen schlecht umsetzen, helfen würde z.B.:
http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2002/n1377.htm
Das einzige, das das Resizen (meiner Einschätzung nach) erheblich schneller machen könnte, wäre einen std::vector<boost::shared_ptrstd::string > zu nehmen. Das macht die erste Erstellung eines Elements zwar langsamer und verlangsamt auch den allgemeinen Zugriff auf die Strings (eine Indirektion mehr), dafür geht das Zuweisen zwischen zwei shared_ptrs vermutlich ein gutes Stück schneller, als jeden string Zeichen für Zeichen zu kopieren.
-
operator void schrieb:
Das einzige, das das Resizen (meiner Einschätzung nach) erheblich schneller machen könnte, wäre einen std::vector<boost::shared_ptrstd::string > zu nehmen. Das macht die erste Erstellung eines Elements zwar langsamer und verlangsamt auch den allgemeinen Zugriff auf die Strings (eine Indirektion mehr), dafür geht das Zuweisen zwischen zwei shared_ptrs vermutlich ein gutes Stück schneller, als jeden string Zeichen für Zeichen zu kopieren.
Das glaube ich nicht, jedenfalls nicht in diesem speziellen Fall. Eine ernstzunehmende Implementierung von std::string wird den internen Buffer ohnehin sharen, mit Copy-On-Write, wie es wohl auch boot::shared_ptr macht. Das wäre dann also doppelt gemoppelt - und sehr wahrscheinlich langsamer als die naive Verwendung eines std::vectorstd::string.
Ausprobieren, Geschwindigkeit *messen* und nur vom geraden Weg abweichen, wenn man *weiß*, daß es notwendig ist. (In der Regel also eher nicht
)Stefan.
-
Eine ernstzunehmende Implementierung von std::string wird den internen Buffer ohnehin sharen, mit Copy-On-Write
Ich glaube spätestens seit Herb Sutters "More Exceptional C++" wird keine ernstzunehmende Implementation mehr dem Nutzer eine COW-String-Implementierung aufs Auge drücken. Vielleicht noch optional, aber nicht mehr verpflichtend.
-
HumeSikkins schrieb:
Ich glaube spätestens seit Herb Sutters "More Exceptional C++" wird keine ernstzunehmende Implementation mehr dem Nutzer eine COW-String-Implementierung aufs Auge drücken. Vielleicht noch optional, aber nicht mehr verpflichtend.
Ich glaube, da liegst du falsch. Aber Glauben heißt nicht wissen - klar. Sagen wir so: Alle Implementierungen, die ich kenne (insgesamt drei) arbeiten mit geschareten Repräsentationen. Außerdem würde ich gerade im Falle von Strings dies auch erwarten.
Leider habe ich (hier) keinen Sutter greifbar und kann mir deinen Verweis auf ihn nicht erklären. Meinst du Exception-Sicherheit?
Stefan.
-
Hallo,
Außerdem würde ich gerade im Falle von Strings dies auch erwarten
Ich habe das früher auch immer für eine tolle Optimierung gehalten. Dann habe ich MEC++ gelesen.
Wenn du das Buch gerade nicht zur Hand hast:
Erst das:
http://www.gotw.ca/gotw/045.htm
und dann das:
http://www.gotw.ca/publications/optimizations.htm
-
@Hume:
Danke für den Tip!Stefan.