Wieso ist das addieren mit vector so langsam



  • Hallo, ich wollte wissen wieso diese schleife bei ab ca. 25000 durchläufen der schleife lagsam wird. Als ich das problem vorher mit array gelöst habe war das mindestens 10 mal so schnell. Kann es einfach daran liegen dass es halt ein vector ist und kein array oder habe ich hier einen fehler gemacht?

    int summe;
    int i=0;
    while(i<(int)FormHauptmenu->syszahlen.size())
    {
       Application->ProcessMessages();
       if(FormHauptmenu->abbruch)
          break;
    
       summe=0;
    
       summe+=FormHauptmenu->syszahlen[i].z1;
       summe+=FormHauptmenu->syszahlen[i].z2;
       summe+=FormHauptmenu->syszahlen[i].z3;
       summe+=FormHauptmenu->syszahlen[i].z4;
       summe+=FormHauptmenu->syszahlen[i].z5;
       summe+=FormHauptmenu->syszahlen[i].z6;
    
       if(summe<FormHauptmenu->summemin || summe>FormHauptmenu->summemax)
          FormHauptmenu->syszahlen.erase(FormHauptmenu->syszahlen.begin()+i);
       else
          i++;
    }
    


  • Hallo, was ich noch gemerkt habe: Wenn ich beim vektor nicht erase anwende dann läuft es genauso schnell wie mit dem array. Sobald ich aber vector.erase() anwende dann wird das ganze super langsam. Woran kann es denn liegen. Ist das löschen hauptsächlich so langsam. ich dachte das wird schneller da ich den stack dadurch doch entleere. Ich habe es probeweise ohne erase gemacht sondern nur dann alles auf 0 gesetzt wenn diese zeile der if bedingung entsprach. Es lief super schnell. Nur wie gesagt. sobald ich das erase anwende dann wars das. Gibt es vieleicht eine andere möglichkeit? Vieleicht mache ich was falsch mit dem iterator?



  • Hast du beim Array kein erase angewendet?



  • Hallo, nein beim array habe ich das nicht gemacht. einfach nur alles auf null gesetzt, dann wußte ich beim auslesen welches auszulesen ist. Was ich aber gerade nachgelesen habe ist, vectoren brauche bei erase und insert sehr viel zeit das sie ja alles umkopieren müssen sobald in der mitte gelöscht wird. deshalb wird auf liste empfohlen. kann mir jemand vieleicht sagen ob das war ist?



  • Jo, so ist das 😉 Ein vector ist intern ja auch nur ein Array.



  • Hallo, danke aber deine Antwort birngt mich auch nicht weiter



  • BlackDragon schrieb:

    Hallo, was ich noch gemerkt habe: Wenn ich beim vektor nicht erase anwende dann läuft es genauso schnell wie mit dem array. Sobald ich aber vector.erase() anwende dann wird das ganze super langsam. Woran kann es denn liegen.

    Wernn du ein Eintrag aus dem Vector löscht, muss er das interne Array neu anordnen, da es den Xten- Eintrag ja nicht mehr gibt. Das macht es langsam. Das kannst du auch nicht mit einem Array vergleichen. Oder hast du es schon mal geschaft in einem Array den Xten Eintrag zu löschen ohne das array neu aufzubauen ?

    BlackDragon schrieb:

    Gibt es vieleicht eine andere möglichkeit? Vieleicht mache ich was falsch mit dem iterator?

    Iteratror, gute Idee. Welchen ? Du verwendest keinen.

    Übrigens ist für deine Zwecke wohl ein valarray vielleicht besser geeignet.


Anmelden zum Antworten