Effizienzfrage: 1/4 oder 0.25
-
Ist es eigentlich effizienter anstatt von
foo * 5 * 1/4;
sofort
foo * 5 * 0.25
zu schreiben, da der Rechenschritt eins geteilt durch vier ja nicht mehr extra berechnet werden muss?
Oder ist es aufgrund von Compileroptimierung sowieso Latte?
-
Ich hoffe mal für die Compiler-Bauer, das es latte ist!
Wehe der Compiler rechnet das nicht schon zur Compilezeit aus!
-
genau genommen kommt bei
foo * 5 * 1/4
was anderes raus als bei
foo * 5 * .25
da für den Compiler 1/4 = 0 ist (Hallo Integer)
grüße, Con@n
-
Con@n schrieb:
da für den Compiler 1/4 = 0 ist
Somit ist natuerlich ganz klar
foo * 5 * 1/4;
schneller, weil das ohne probleme zu
0
optimierbar ist.
-
Na ja,
das hängt jetzt davon ab, welchen Wert foo hat.
Wenn foo ausgerechnet 42 ist, dann kann der Compiler schon eine Weile brauchen. So ca. 7 1/2 Millionen Jahre
Don't Panic, Con@n
-
Somit ist natuerlich ganz klar
foo * 5 * 1/4;
schneller, weil das ohne probleme zu
0
optimierbar ist.Wieso nimmst du einfach an, foo sei von einem ganzzahligen Typ? Es könnte doch auch den Typ float oder double haben und NaN mal irgendwas ist immer NaN.
-
foo * 5 * 1/4;
foo * 5 * 0.25
ersteres ist stets equivalent zu
foo * 5 / 4;
wenn foo ein integer typ ist, dann sind das zwei völlig verschiedene sachen.
wenn float dagegen irgend ein gleitkommatyp ist, dann wäre es in diesem falle möglich, dass der compiler /4 durch *0.25 (oder *0.25f wenn foo vom typ float ist) ersetzt, weil es keine rundungsfehler irgendwelcher art erzeugt, und daher equivalent ist. auf keinen fall darf der compiler das ganze zu
foo * 1.25;
machen, dann das ist etwas völlig anderes.
etwas anderes wäre
5.0 / 4 * foo;
bzw.
5 * 0.25 * foo;
hier darf (und wird) der compiler die konstanten zusammenfassen.
-
ich hab so das gefühl, dass er/sie einfach nur wissen wollte, ob eine multiplikation oder eine division schneller is, kann das sein?
-
KennyMcCormick schrieb:
ich hab so das gefühl, dass er/sie einfach nur wissen wollte, ob eine multiplikation oder eine division schneller is, kann das sein?
Ne Multiplikation ist normalerweise schneller, aber bei Konstanten ist es wie gesagt latte.
-
Hmm,
da 4 'ne Zweierpotenz ist, ersetzt der Compiler die Division (foo*5/4) durch ein ShiftRight (sar oder shr). Natürlich nur, wenns Sinn macht, und foo keine Konstante ist.const int bar=foo*5/4; mov eax,dword ptr [foo] imul eax,eax,5 cdq and edx,3 add eax,edx sar eax,2 mov dword ptr [bar],eax
_Aber_, zumindest der Studio7.1 Compiler, erkennt nicht, dass 0.25f=1/4f ist.
const int bar=foo*5*0.25f; mov eax,dword ptr [foo] imul eax,eax,5 cvtsi2ss xmm0,eax mulss xmm0,dword ptr [__real@3e800000 (60CB38h)] cvttss2si ecx,xmm0 mov dword ptr [bar],ecx
Die Division ist dem Fall tatsächlich schneller.[1]
Gruß
[1] Wenn man mal 1/4=0 ausschließt....