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 ; Dbb
-
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 ; Ddu 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.