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.


Log in to reply