Entwickler-Ecke

Algorithmen, Optimierung und Assembler - if-then-else ODER wertberechnung


ichfalk - Fr 21.01.05 16:23
Titel: if-then-else ODER wertberechnung
Hallo!

Was ist schneller?


Delphi-Quelltext
1:
2:
3:
if (schnitt = 1
  then genauigkeit := 2;
else genauigkeit := 0;


ODER


Delphi-Quelltext
1:
genauigkeit := 2 * schnitt;                    


(schnitt kann nur 0 oder 1 sein...)

Falk.

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.


HolgerB - Fr 21.01.05 16:34

Hallo,
ich würde es so probieren:


Delphi-Quelltext
1:
Genauikeit := shl(schnitt);                    


Meines Wissens nach sind Bittverschiebungen eine der Schnellsten Rechenoperationen.
shl bewirkt *2
shr bewirkt div 2


Gruß
Holger


I.MacLeod - Fr 21.01.05 22:31

Die korrekte Syntax dazu ist:


Delphi-Quelltext
1:
genauigkeit := schnitt shl 1;                    


Falls schnitt auch 2435 sein kann könntest du mal das hier versuchen:


Delphi-Quelltext
1:
genauigkeit := byte(schnitt=1shl 1;                    


Aber keine Garantie auf irgendeinen Geschwindigkeitsvorteil ;-)

IIRC optimiert Delphi *2^n aber auch automatisch mit shl.


uall@ogc - Fr 21.01.05 23:00

also ich habs mal getestet


beide lokal:

aus genauigkeit := 2*schnitt
macht delphi nen


Delphi-Quelltext
1:
2:
mov ebx, eax
add ebx, eax


das sehr schnell

aus genauigkeit := schnitt shl 1 macht delphi das selbe (also genau gleich schnell)

aus der if abfrage macht delphi was längeres (nicht schnell)

wenn man globale variablen benutzt (delphi greift dan auf den speicher zu und nimmt nicht die variablen als register)

ist:

genauigkeit := 2*schnitt bzw. genauigkeit shl 1 eigentlich genau so schnell wie


Delphi-Quelltext
1:
2:
3:
4:
5:
asm
  mov eax, [schnitt]
  shl eax, 1
  mov [genauigkeit], eax
end;



was etwas das selbe ist

also die if abfrage ist langsamer :P

Moderiert von user profile iconChristian S.: Delphi- bzw. Code-Tags korrigiert