Perfomance



  • VC und DX hat nix mit schlechtem Code zu tun, der unperformant ist 😉

    Und zwischen i++ und ++i ist ein unterschied.
    ++i wird sofort ausgeführt, keine Seiteneffekte
    i++ erst später, und es treten Seiteneffekte auf, die Zeit kosten.

    Bei int ist es eigentlich Wurst ob ++i oder i++
    Aber probier mal das beim Iterator oder so zu machen. Du wirst dich wundern.



  • @bobba
    Das Umändern von i++ auf ++i solltest du natürlich nur machen, wenn es den Programmablauf nicht verändert. Wenn es wichtig ist, dass die Variable erst nach der Auswertung inkrementiert bzw. dekrementiert wird, dann musst du das natürlich lassen.



  • Wenn du ein komplexes Objekt mit einer Funktion verarbeitest und anschliessend auch wieder das selbe Objekt - oder zumindest dessen Inhalt - im selben Ausgangs-Objekt speichern willst, dann arbeite mit Pointern.

    (edit)
    Ach ja, was ist denn jetzt der genaue Unterschied zwischen ++i und i++ ? 😕





  • Cpp_Junky schrieb:

    Wenn du ein komplexes Objekt mit einer Funktion verarbeitest und anschliessend auch wieder das selbe Objekt - oder zumindest dessen Inhalt - im selben Ausgangs-Objekt speichern willst, dann arbeite mit Pointern.

    (edit)
    Ach ja, was ist denn jetzt der genaue Unterschied zwischen ++i und i++ ? 😕

    Der Unterschied ist folgender:

    a = i++; // hier wird a i zugewiesen, anschließend wird i um 1 erhöht.
    a = ++i; // hier wird i um eins erhöht, anschließend wird a i zugewiesen.

    Warum sollte man in deinem Beispiel mit Pointern arbeiten? Was spricht gegen Referenzen?



  • @junky
    Einfach ausgedrückt:
    Bei ++i wird die Variable einfach erhöht
    Bei i++ muss noch eine Kopie der Variablen angefertigt werden, die dann ausgewertet werden kann.



  • Referenz anstatt Pointer ? 😕
    Das meinte ich damit! Hab mich vielleicht nicht korrekt ausgedrückt.

    Also ich meinte sowas:

    DeinObjekt = MachWas(DeinObjekt)
    ...umbasteln in dies hier:
    MachWas(&DeinObjekt)



  • @junky
    Das ist ein Zeiger. Bei ner Referenz würde es so aussehen (vom Aufruf her):

    MachWas(DeinObjekt);

    Bei der Deklaration müsstest du aber anstatt dem * ein & angeben. In der Funktion kannst du den Parameter dann übrigens auch ganz normal ansprechen, ohne *



  • AJ schrieb:

    @junky
    Das ist ein Zeiger. Bei ner Referenz würde es so aussehen (vom Aufruf her):

    MachWas(DeinObjekt);

    Bei der Deklaration müsstest du aber anstatt dem * ein & angeben. In der Funktion kannst du den Parameter dann übrigens auch ganz normal ansprechen, ohne *

    Das, was Junky geschrieben hat, ist vollkommen richtig gewesen.



  • AJ schrieb:

    @junky
    Das ist ein Zeiger. Bei ner Referenz würde es so aussehen (vom Aufruf her):

    MachWas(DeinObjekt);

    Bei der Deklaration müsstest du aber anstatt dem * ein & angeben. In der Funktion kannst du den Parameter dann übrigens auch ganz normal ansprechen, ohne *

    Call-By-Value:
    MachWas(DeinObjekt);

    Call-By-Reference:
    MachWas(&DeinObjekt);

    Mit zusätzlichem Pointer (Vom Prinzip wie Referenz)
    DeinObjekt* pObj = &DeinObjekt
    MachWas(pObj);

    😉



  • ist es eigentlich generell schlechter Stil, in C++ ein Objekt oder einen Pointer auf ein Objekt, als Rückgabewert zu haben? Oder gibt es Stellen, wo das gerechtfertigt ist?



  • Wenn du einen Rückgabewert hast, ist dieser eigentlich immer ein Objekt (oder der Inhalt, sprich "Wert") 🙂
    Manchmal ist es halt nur sinnvoller (oder sogar schneller), einen Pointer zurückzugeben.



  • Cpp_Junky schrieb:

    Wenn du einen Rückgabewert hast, ist dieser eigentlich immer ein Objekt (oder der Inhalt, sprich "Wert") 🙂
    Manchmal ist es halt nur sinnvoller (oder sogar schneller), einen Pointer zurückzugeben.

    Ein Wert (wie int, float, double, ...) unterscheidet sich grundlegend von einem Objekt.



  • int und double sind auch nur Klassen.



  • Ups stimmt ja, bei Referenzen muss man trotzdem noch die Adresse angeben.

    @Junky
    Dass int und double Klassen sind, ist mir neu 😮
    Was für Methoden haben die denn so zu bieten? Oder haben sie nur Eigenschaften? 😕



  • Ja, streng genommen ist das so. Definiert ist das ganze in den C++ Standard-Libs. Das ist nunmal das Prinzip von C++.
    Methoden ? Naja Operatoren gibts natürlich :p +,-,/,* usw.



  • Naja mir solls recht sein



  • kann mal jemand ein konkretes beispiel zeigen?



  • Thema in/dekrementieren:

    ob man jetzt ++i oder i++ schreibt ist bei einem guten Compiler egal. Der Msvc++6 zB macht anscheinend automatisch aus einem i++ ein ++i wenn er merkt dass es geht.

    Ich habe grade folgenden Test gemacht:

    int main(int argc, char* argv[])
    {
    	Sleep( 2000 );
    
    	unsigned int i;
    	char out[333];
    	DWORD zeit1, zeit2;
    
    	zeit1 = GetTickCount( );
    	for( i=0 ; i<0xffffffff ; i-- )
    	{
    		i++;
    		f( i ); // Das muss sein, sonst wird die Schleife komplett wegoptimiert
    		i++;		
    	}
    	zeit1 = GetTickCount() - zeit1;
    
    	zeit2 = GetTickCount();
    	for( i=0 ; i<0xffffffff ; --i )
    	{
    		++i;
    		f( i );
    		++i;		
    	}
    	zeit2 = GetTickCount() - zeit2;
    
    	itoa( zeit1, out, 10 );
    	printf( out );
    	printf( "\n" );
    	itoa( zeit2, out, 10 );
    	printf( out );
    	printf( "\n" );
    }
    

    Ausgabe:

    55119
    55740
    Press any key to continue
    

    Der compiler denkt also mit. Ich schreibe aber auch immer ++i, das habe ich mir wegen diesem Gerücht angewöhnt 😉



  • @0x1
    Ist bei deinem Beispiel die zweite Schleife nicht langsamer??

    @bobba
    Mir ist noch was eingefallen zum Optimieren der Performance. Du kannst beim Teilen von Zahlen noch einen kleinen Trick anwenden. Wenn du z. B. durch 2 teilst, dann kannst du auch die bits der Zahl einfach um 1 nach rechts verschieben. Das funktioniert natürlich auch beim Multiplizieren mit 2. Das kannst du natürlich auch mit anderen Zahlen machen. Alle potenzierten Zahlen mit der Basis 2. Also 2, 4, 8, 16, 32, ...
    Ist hald die Frage, ob das der Compiler nicht eh schon von selber macht, aber ein Versuch ists wert ;).


Anmelden zum Antworten