Funktionen



  • unskilled schrieb:

    float Distance(float x1, float y1, float z1, float x2, float y2, float z2) 
    {
        x1 -= x2;
        y1 -= y2;
        z1 -= z2;
        const float distance_square = x1*x1 + y1*y1 + z1*z1;
        return static_cast <float> sqrt(distance_square); 
    }
    

    Schreib doch gleich alles in Assembler :p
    Kann dein Compiler keine mehrfach verwendeten Teilausdrücke eliminieren? Das ist eigentlich eine Standardtechnik ... dann kommt in der lesbaren und in der 'optimierten' Version auch der gleiche Code raus.



  • vermutlich kann er das, weil er von MS ist 🤡
    aber ich denke nicht, dass er den -= operator nutzen würde - ich tippe mal auf den - operator... aber bin gerade zu faul das zu testen - vll hat ja nen anderer mehr lust und kann besser asm als ich das kann ; D

    bb



  • unskilled schrieb:

    vermutlich kann er das, weil er von MS ist 🤡
    aber ich denke nicht, dass er den -= operator nutzen würde - ich tippe mal auf den - operator... aber bin gerade zu faul das zu testen - vll hat ja nen anderer mehr lust und kann besser asm als ich das kann ; D

    du weisst schon dass es bei primitiven datentypen keinen unterschied zwischen - und -= gibt, oder?

    wenn der compiler hier nicht richtig optimiert, dann stimmt etwas nicht.

    merke: immer zuerst schoen und korrekt programmieren und _dann_ erst an performance denken wenn der profiler es dir gesagt hat.



  • Shade Of Mine schrieb:

    das hier ist zB premature optimization die nichts bringt.

    genau.
    und weil premature optimization mein hobby ist, zeige ich mal, wie das richtig geht:

    float Distance(float x1, float y1, float z1, float x2, float y2, float z2) 
    { 
        return sqrt(DistanceSquare(x1,y1,z1,x2,y2,z2); 
    }
    //und damit das klappt, braucht man noch
    float DistanceSquare(float x1, float y1, float z1, float x2, float y2, float z2)
    {
       return Square(x2-x1)+Square(y2-y1)+Square(z2-z1);
    }
    //und damit das klappt, braucht man noch
    float Square(float x)
    {
       return x*x;
    }
    


  • unskilled schrieb:

    Es ist nun mal unsinnig beide als referenz zu übernehmen und dafür nen neues objekt zu erzeugen - die signatur ist nun mal so... ^^

    Naja, wie gesagt Geschmackssache. Aber eigentlich kommt es schlussendlich nicht so drauf an.

    unskilled schrieb:

    Weils effektiver ist!? ^^
    Und keinerlei Nachteile hat außer vll die ungewohnte Signatur ^^

    Naja, ich würde es trotzdem eher so machen. Das temporäre Objekt ( Left - Right ) kann womöglich wegoptimiert werden.

    float Distance(const Point& Left, const Point& Right) 
    { 
        Point DistanceVec = Left - Right; 
        return Dotproduct(DistanceVec, DistanceVec);
    }
    

    unskilled schrieb:

    Macht ihr das wirklich immer so?
    Was spricht dagegen, es nicht über den swap weg zu implementieren?

    Zum Beispiel Exceptionsicherheit und Codeduplizierung. Siehe auch diesen Thread.


Anmelden zum Antworten