Performanceprobleme



  • Hallo,

    folgender Codeblock wird in einem OpenGL Programm benutzt:

    glPushMatrix();
    		for(int _i=0; _i <= myIcons.getIconVector().at(i)->getName().length(); _i++)
    		{
    			glRasterPos3f (
    				myIcons.getIconVector().at(i)->getX(),
    				myIcons.getIconVector().at(i)->getY(),
    				myIcons.getIconVector().at(i)->getZ());
    
    		}
    glPopMatrix();
    

    getIconVector():

    vector<IconDrawer*> IconGetter::getIconVector()
    {
    	return iconVector;
    }
    

    Lasse ich den Block so stehen, wird das Programm extrem langsam.
    Ändere ich den Block zu:

    ...
    ...
    glRasterPos3f (3,3,3);
    ...
    ...
    

    Ist es wieder "normal" schnell. Also scheint es an den

    myIcons.getIconVector().at(i)->getX()
    

    zu liegen. Aber warum? Ist da an der Methode was nicht in Ordnung?

    gruß
    Alex



  • Wenn getIconVector einen std::vector zurückliefert, dann ist die at methode langsamer als der zugriff mit []. 3*getIconVector().at(i) machst es auch nicht schneller. Debugmodus ausschalten.



  • und warum hast du einmal _i und einmal i in der schleife?



  • i kommt aus einer anderen schleife weiter oben.

    Ohne Debugmodus wird es auch nicht schneller...



  • Wo ist der Sinn der Schleife? So wie ich das sehe, ist

    glPushMatrix();
        glRasterPos3f (
            myIcons.getIconVector().at(i)->getX(),  //benutzt i aus der aeusseren schleife
            myIcons.getIconVector().at(i)->getY(),
            myIcons.getIconVector().at(i)->getZ());
    glPopMatrix();
    

    Äquivalent zu Deinem Code.



  • Du konvertierst da aber nicht float zu int, oder? - Das ist nämlich extreem langsam.



  • Wow stimmt, keine Ahnung was ich da gebaut hab.

    Die innere Schleife fungierte als Bremse...danke!



  • filth schrieb:

    Wow stimmt, keine Ahnung was ich da gebaut hab.

    Na, ne Bremse :p



  • mmmmmmmmmmmmmmmmmmmmmmmmm schrieb:

    filth schrieb:

    Wow stimmt, keine Ahnung was ich da gebaut hab.

    Na, ne Bremse :p

    Immerhin funktioniert die gut 😉



  • Na, ne Bremse :p[/quote]

    Immerhin funktioniert die gut ;)[/quote]

    Naja, Wenn du irgendwann ein Haus bauen lässt, wundere dich nicht wenn der Bauherr am schluß sagt: Zugegeben, es ist ein übergroßer Salzstreuer, aber dafür funktioniert er gut.



  • erm, dumme Frage ... was natürlich auch schön bremsen könnte wäre:

    vector<IconDrawer*> IconGetter::getIconVector() 
    { 
        return iconVector; 
    }
    

    Da da jeweils eine Kopie deines vectors zurückgegeben wird und aus diesem Grund dieser vector bei den Aufrufen ( jetzt inklusive der Schleife ) x-mal kopiert wird, ich würde ne Referenz auf den vector zurückgeben und diesen außerdem als lokale Kopie einmalig halten (obwohl, wenn man den als Referenz aufnimmt, würde er ja gar nicht kopiert, ach egal) und dann diesen vector durchlaufen, die Aufrufe immer wieder könnten bei häufiger Verwendung auch einen Flaschenhals ergeben



  • Wie kann ich denn eine Referenz auf den Vektor zurückgeben? (Sorry c++ Anfänger)

    Gruß
    Alex



  • Indem du den Rückgabewert entsprechend deklarierst

    const vector<IconDrawer*>& IconGetter::getIconVector() //konstante Referenz
    {
        return iconVector;
    }
    


  • Das sollte hier kein Problem darstellen.


Anmelden zum Antworten