Schleife mit Stringlängenausgabe dauert zu lange



  • Hi,
    ich hab folgendes Problem: Ich hab eine Klasse, die eine Person darstellt und in der gibt es eine Methode, die die Länge des kompletten Namens (Vor- und Nachname) zurück gibt:

    class Person
    {
    private:
    
        std::string firstName;
        std::string lastName;
    
        // ...
    
    public:
    
        int GetNameLength();
    };
    

    Von der Klasse hab ich jetzt mehrere Objekte (so an die hundert) in ein Array gepackt und gebe in einer Schleife die Längen von allen Namen aus. Aber das dauert immer furchtbar lange. Woran kann das liegen?



  • Mach das mal mit std::for_each, dürfte ein wenig schneller gehen als mit ner for.. schleife.
    rya.



  • Zeig doch mal wie du die Namen ausgibst. Vielleicht gibts da irgendwo einen Flaschenhals. Was für ein "Array" benutzt du? Ein std::vector? oder ein Standard-Array?



  • Scorcher24 schrieb:

    Mach das mal mit std::for_each, dürfte ein wenig schneller gehen als mit ner for.. schleife.
    rya.

    Mit Sicherheit nicht. Rate mal, was std::for_each() intern macht...

    Beje, H. schrieb:

    Von der Klasse hab ich jetzt mehrere Objekte (so an die hundert) in ein Array gepackt und gebe in einer Schleife die Längen von allen Namen aus. Aber das dauert immer furchtbar lange. Woran kann das liegen?

    Die Streams brauchen relativ viel Performance, besonders, wenn ein Austausch mit dem Betriebssystem (Konsole, Dateien) stattfindet. Zeig ansonsten mal die Funktion.



  • Scorcher24 schrieb:

    Mach das mal mit std::for_each, dürfte ein wenig schneller gehen als mit ner for.. schleife.
    rya.

    Gehört for_each nicht erst zum neuen Standard? Außerdem glaube ich nicht, dass es daran liegt. Ein Array mit 100 Einträgen dauert zum Beispiel mehr als drei Minuten zum Durchlaufen.

    Firefighter schrieb:

    Zeig doch mal wie du die Namen ausgibst. Vielleicht gibts da irgendwo einen Flaschenhals. Was für ein "Array" benutzt du? Ein std::vector? oder ein Standard-Array?

    Ich hab beides ausprobiert und beide Male kam das gleiche Problem. Hier der Code mit einem normalen C-Style-Array:

    const int n = 100;
    Person array[n];
    
    // Belegen der Attribute
    // ...
    
    for (int i = 0; i < n; i++)
        cout << array[i].GetNameLength() << endl;
    

    Tja, und nach etwas mehr als drei Minuten ist er dann durch.



  • Beje, H. schrieb:

    Gehört for_each nicht erst zum neuen Standard?

    Nein, std::for_each() ist schon jetzt Teil der STL-Algorithmen. Aber wie gesagt kann es nicht daran liegen.

    Beje, H. schrieb:

    Tja, und nach etwas mehr als drei Minuten ist er dann durch.

    Zeig mal die Funktion GetNameLength() . Ich tippe nach wie vor darauf, dass das Streamen sehr zeitintensiv ist. Hast du das mal gemessen? Und du kompilierst schon mit der Release-Konfiguration...?

    P.S. Ich habe vorhin noch einen Beitrag geschrieben, nicht dass du den überliest... 😉



  • Nexus schrieb:

    Die Streams brauchen relativ viel Performance, besonders, wenn ein Austausch mit dem Betriebssystem (Konsole, Dateien) stattfindet. Zeig ansonsten mal die Funktion.

    Bei 100 ints drei Minuten?! 🙂



  • Okay, ich zeig am besten einfach mal die Funktion:

    int Person::GetNameLength()
    {
        int length = firstName.length()
                   + 1 // Für das Leerzeichen, das bei einer
                       //Ausgabe geschrieben werden würde
                   + lastName.length();
    
        Sleep(2000);
    
        return length;
    }
    


  • Ich bin mir sicher das die 3min niemals durch die Schleife entstehen wo du die namenlänge bestimmst/ausgibst. Wie belegst du denn die Attribute, eventuell hängt es da?



  • LordJaxom schrieb:

    Bei 100 ints drei Minuten?! 🙂

    Oh, das habe ich überlesen. 🙂
    (Wobei, wir wissen ja nicht, was er für einen Computer hat... :p)

    Dann wirds ja wirklich mal Zeit, dass wir die Funktion sehen. 😉



  • Hehe. 😃

    Hey, was denkst du, was Sleep() macht? :p



  • @Beje, H.

    Nich dein ernst der Code?Du fragst warum er so langsam ist, kein Wunder wenn da ein Sleep von 2sec pro durchlauf drinne sind. 😃

    edit: zu langsam, man Nexus du hast doch nen F5 Bot:D:D



  • Firefighter schrieb:

    Nich dein ernst der Code?Du fragst warum er so langsam ist, kein Wunder wenn da ein Sleep von 2sec pro durchlauf drinne sind. 😃

    Aber das brauch ich doch, um sicherzustellen, dass die Funktion auch richtig abläuft. Ich arbeite nämlich unter Windows und Windows ist ja ein Multitaskbetriebssystem. Es könnte ja also sein, dass er, während er noch den Wert length belegt, gleichzeitig schon das return ausführt und die Funktion verlässt und somit einen uninitialisierten Wert zurückliefert. (Wenn die Anweisung "return length;" schneller war als die Anweisung "length = ...".) Deshalb zwinge ich ihn durch das Sleep dazu, mit dem return zu warten, bis er die Zuweisung durchgeführt hat.



  • Beje, H. schrieb:

    Aber das brauch ich doch, um sicherzustellen, dass die Funktion auch richtig abläuft. Ich arbeite nämlich unter Windows und Windows ist ja ein Multitaskbetriebssystem. Es könnte ja also sein, dass er, während er noch den Wert length belegt, gleichzeitig schon das return ausführt und die Funktion verlässt und somit einen uninitialisierten Wert zurückliefert. (Wenn die Anweisung "return length;" schneller war als die Anweisung "length = ...".) Deshalb zwinge ich ihn durch das Sleep dazu, mit dem return zu warten, bis er die Zuweisung durchgeführt hat.

    Das ist Schwachsinn, woher hast du das? Wenn du nicht selber mit mehreren Threads arbeitest, kannst du dich darauf verlassen, dass die Funktion richtig ausgeführt wird - vorausgesetzt, du verwendest keinen veralteten oder verbuggten Compiler.

    Wo kämen wir denn hin, wenn wir nach jeder Anweisung Sleep() aufrufen müssten, um sicherzustellen, dass die vorherigen Anweisungen bereits verarbeitet wurden? 🙄



  • Beje, H. schrieb:

    Firefighter schrieb:

    Nich dein ernst der Code?Du fragst warum er so langsam ist, kein Wunder wenn da ein Sleep von 2sec pro durchlauf drinne sind. 😃

    Aber das brauch ich doch, um sicherzustellen, dass die Funktion auch richtig abläuft. Ich arbeite nämlich unter Windows und Windows ist ja ein Multitaskbetriebssystem. Es könnte ja also sein, dass er, während er noch den Wert length belegt, gleichzeitig schon das return ausführt und die Funktion verlässt und somit einen uninitialisierten Wert zurückliefert. (Wenn die Anweisung "return length;" schneller war als die Anweisung "length = ...".) Deshalb zwinge ich ihn durch das Sleep dazu, mit dem return zu warten, bis er die Zuweisung durchgeführt hat.

    Willst du hier trollen? Bullshit was du da erzählst.

    EDIT:WAAAA!!! Nexus 😡 :p 😃



  • Firefighter schrieb:

    EDIT:WAAAA!!! Nexus 😡 :p 😃

    Diesmal waren es ganze 11 Sekunden. Aber ich kann dich durchaus verstehen, das passiert mir selber andauernd. 😃



  • Nexus schrieb:

    Das ist Schwachsinn, woher hast du das? Wenn du nicht selber mit mehreren Threads arbeitest, kannst du dich darauf verlassen, dass die Funktion richtig ausgeführt wird - vorausgesetzt, du verwendest keinen veralteten oder verbuggten Compiler.

    Das hab ich von meinem Kumpel. Der ist Diplominformatiker und der muss es ja schließlich wissen oder etwa nicht?



  • Beje, H. schrieb:

    Das hab ich von meinem Kumpel. Der ist Diplominformatiker und der muss es ja schließlich wissen oder etwa nicht?

    Nein. Du kannst dich darauf verlassen, dass die Anweisungen schön der Reihe nach abgearbeitet werden.



  • Beje, H. schrieb:

    Das hab ich von meinem Kumpel. Der ist Diplominformatiker und der muss es ja schließlich wissen oder etwa nicht?

    Ein Titel alleine sagt noch lange nichts über die Qualität aus. Selbst wenn mehrere Threads parallel ablaufen, musst du nur bei gemeinsam genutzten Ressourcen aufpassen. Jeder Thread für sich genommen wird sequenziell abgearbeitet. Und ich bezweifel das du mehrere Threads parallel auf ein und die selbe Console loslässt (=> gemeinsame Ressource) - gerade in einem Singlethreaded-Programm 😉

    cu André



  • Badestrand schrieb:

    Du kannst dich darauf verlassen, dass die Anweisungen schön der Reihe nach abgearbeitet werden.

    Genauer: dass das beobachtbare Verhalten so ist, als würden die Anweisungen schön der Reihe nach abgearbeitet. Außer bei Multithreading (siehe "memory model") (für den OP wohl noch irrelevant).



  • Das hab ich von meinem Kumpel. Der ist Diplominformatiker und der muss es ja schließlich wissen oder etwa nicht?

    Lass dir von einem Diplom-Ingenieur ( steht in der Nahrungskette noch über dem Diplom-Informatiker ^^ ), dass dein Kumpel dich verarscht hat, oder sein Diplom im Lotto gewonnen hat, oder eben die Multithreaded-Geschichte meinte ( aber selbst da ist Sleep.... ähm naja... 😉 )


Anmelden zum Antworten