Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#7

Re: Welcher Vergleich ist schneller?

  Alt 7. Aug 2008, 14:13
benutze
if i <> 0 then da dies mit der größteren Wahrscheinlichkeit schneller ist als die anderen Abfragen. Zudem ist es auch mehr "bulletproof" da es im Grunde nur den Zustand 0 oder <> 0 gibt. Der Integer in Variable I liegt schon in einem CPU register vor. Die Abfrage ob I <> 0 ist ist dann eine einfache Instruktion wie Subtraktion/TEST etc. auf diesem einem Register. Danach folgt ein bedingter Sprungbefehl der nur noch das Zero-Flag der CPU auswerten muß.

Raus kommt also inetwa sowas:
[asm]
mov eax, I
tst eax, eax
brnz @SprungZu_Ist_Nicht_Null
[/asm]


Da nur das register EAX involviert ist kann die Pipeline Struktur der CPU diese Abfrage (speicht 3 Opcodes) in einer eigenen Pipeline mit vollem Durchsatz abarbeiten, und in den anderen Pipelines kann die CPU andere Aufgaben abarbeiten.

Die Abfrage
if i == 1 then zb. würde dageben so umgesetzt werden müssen

[asm]
mov eax, I
mov edx, 1
cmp eax, edx
breq @Sprung_Zu_I_gleich_1
[/asm]

Hier sieht man schon das 2 Register benötigt werden, was den Druck auf die Piplines der CPU erhöht und somit die Wahscheinlichkeit für langsammere Abarbeitung.

if I > 0 then; ist schlichtwqeg falsch, also Thema verfehlt. Denn du möchtest prüfen ob I, eine vorzeichenbehaftete Zahl, ungleich NULL ist und nicht größer NULL.

Was wäre wenn I = -10 ist ?
Dann wäre I > 0 == FALSE, aber I == 0 ebenfalls FALSE ! und I <> 0 == TRUE obwohl aber nicht I > 0 wäre !

Somit bildet diese Abfrage nicht exakt das ab was unsere Zielsetzung ist, nämlich zu testen ob I <> 0 ist. Mit der Abfrage I <> 0 hat man also im kompletten Wertebereich des Integers die schnellste Abfrage aus Sicht der Möglichkeiten der Intel CPUs und gelichzeitig noch den kugelsichersten Source aus Sicht der Logik im Programablauf.

Gruß Hagen
  Mit Zitat antworten Zitat