std::string + int
-
Hi,
Wie kann ich sowas (siehe unten) ohne viel Aufwand, also ohne stringstreams usw. am Besten machen?
string test = "abc"; for(int i=0;i<1000;i++){ myfunc(test + i.c_str()); }
(Ist nur ein Beispiel)
Danke
-
In C++ wirst du es nicht mit weniger Aufwand als
std::stringstream
machen können (zumindest nicht mit der Standardbibliothek).Was ist denn so schlimm daran?
string test = "abc"; for(int i=0;i<1000;i++) { std::stringstream Stream; Stream << test << i; myfunc(Stream.str()); }
Okay, dieser Code ist vielleicht nicht sehr optimal, da in jedem Schleifendurchgang ein neues Objekt angelegt wird. Jedoch ist es so am "einfachsten" (im Sinne von wenig Aufwand) handzuhaben. Wenn dir Boost zur Verfügung steht, schau dir mal
boost::lexical_cast
an.
-
Nexus schrieb:
Was ist denn so schlimm daran?
Naja, meine Code war ja nur ein Beispiel, in meiner Anwendung wird die Schleife einige Tausend bis Millionen mal durchlaufen und da ist es, wie du auch bereits gesagt hast, einfach zu langsam. itoa() übrigens auch...
Boost habe ich nicht.
Gibts da keine flotte Alternative?
-
hezz schrieb:
Boost habe ich nicht.
Von der Performance her macht das auch keinen relevanten Unterschied, da
boost::lexical_cast
intern auch mitstd::stringstream
arbeitet.hezz schrieb:
Naja, meine Code war ja nur ein Beispiel, in meiner Anwendung wird die Schleife einige Tausend bis Millionen mal durchlaufen und da ist es, wie du auch bereits gesagt hast, einfach zu langsam.
Vermutest du das nur, oder hast du es mit einem Profiler gemessen? Ersteres wäre ein starker Hinweis auf Premature Optimization.
hezz schrieb:
Gibts da keine flotte Alternative?
Dazu müsste man natürlich wissen, wie die aufgerufene Funktion arbeitet. Natürlich kann man auch den
stringstream
erhalten (indem man ihn ausserhalb der Schleife deklariert) und immer wieder die letzte Zahl entfernen und neu einlesen. Aber ob das so viel schneller ist, ist nicht einmal garantiert.
-
Warum brauchst du soviele Strings mit Zahlen dran?
-
Nexus schrieb:
hezz schrieb:
Boost habe ich nicht.
Von der Performance her macht das auch keinen relevanten Unterschied, da
boost::lexical_cast
intern auch mitstd::stringstream
arbeitet.hezz schrieb:
Naja, meine Code war ja nur ein Beispiel, in meiner Anwendung wird die Schleife einige Tausend bis Millionen mal durchlaufen und da ist es, wie du auch bereits gesagt hast, einfach zu langsam.
Vermutest du das nur, oder hast du es mit einem Profiler gemessen? Ersteres wäre ein starker Hinweis auf Premature Optimization.
hezz schrieb:
Gibts da keine flotte Alternative?
Dazu müsste man natürlich wissen, wie die aufgerufene Funktion arbeitet. Natürlich kann man auch den
stringstream
erhalten (indem man ihn ausserhalb der Schleife deklariert) und immer wieder die letzte Zahl entfernen und neu einlesen. Aber ob das so viel schneller ist, ist nicht einmal garantiert.Habe es nur mit itoa() (das sollte doch eig. schneller sein als stringsteam oder?) getestet und das ist schon extrem langsam, weil da extra noch der buffer etc. kopiert werden muss usw...ich hätte gedacht man könnte das ohne Kopiererei usw. machen, so wie es in anderen Sprachen auch geht.
Naja ich teste es nochmal mit stringstream und sonst muss es wohl langsam bleiben.
Vielen Dank trotzdem!
-
sinn??? schrieb:
Warum brauchst du soviele Strings mit Zahlen dran?
Wieso viele Zahlen? Ich habe einen String uns muss eine Funktion mit einem String als Parameter aufrufen der jeweils hinten eine andere Zahl enthält.
-
Hat das myfunc übersehen. Testest du im Debug oder Release Mode? Warum übergibst du nicht Zahl und string getrennt?
-
@ hezz:
Wenn du schon meinen gesamten Beitrag zitierst, könntest du wenigstens auf eine Frage Bezug nehmen. :pAlso nochmals: Woher weisst du, dass es langsam ist? Intuition? Hast du es gemessen? Oder fällt es einfach beim Ablauf des Programms auf?
Und sag doch bitte, was deine Funktion genau tut. Möglicherweise kann man da noch etwas optimieren.
-
Nexus schrieb:
@ hezz:
Wenn du schon meinen gesamten Beitrag zitierst, könntest du wenigstens auf eine Frage Bezug nehmen. :pAlso nochmals: Woher weisst du, dass es langsam ist? Intuition? Hast du es gemessen? Oder fällt es einfach beim Ablauf des Programms auf?
Und sag doch bitte, was deine Funktion genau tut. Möglicherweise kann man da noch etwas optimieren.
OK, also das Prog ließt Zeile aus einer Datei und muss dann jeweils die Zeile + Zahlen von 0 bis 99 an eine Funktion (die ich nicht verändern kann/darf) übergeben und da die Datei sehr groß ist läuft es auch sehr oft durch und daher muss es schnell sein und stringstream ist es nicht (habs gerade getestet ).
-
Das einlesen von Datei ist wahrscheinlich 10000mal langsamer als atoi und Co.
-
hezz schrieb:
OK, also das Prog ließt Zeile aus einer Datei und muss dann jeweils die Zeile + Zahlen von 0 bis 99 an eine Funktion (die ich nicht verändern kann/darf) übergeben und da die Datei sehr groß ist läuft es auch sehr oft durch und daher muss es schnell sein und stringstream ist es nicht (habs gerade getestet ).
Das langsamste daran isxt definitv das Lesen aus der Datei. Da macht es kaum einen Unterschied ob du stringstream, itoa oder eine selbstgebaute Funktion komplett mit optimiertem Inline Assembler benutzt.
Systeme sind immer nur so effizient wie ihre ineffizientesten "Bottlenecks" - und das ist hier definitv der Dateizurgiff.