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 mit std::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 mit std::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. :p

    Also 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. :p

    Also 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.


Anmelden zum Antworten