Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Welcher Vergleich ist schneller? (https://www.delphipraxis.net/118417-welcher-vergleich-ist-schneller.html)

Fussball-Robby 7. Aug 2008 12:12


Welcher Vergleich ist schneller?
 
Hey, ich habe mal eine Frage die ich mir gestern abend gestellt habe. Ist zwar nicht unbedingt wichtig, würde mich aber mal interessieren.
Wenn ich eine (Integer-)Variable habe, die entweder 0 oder 1 ist, wie kann ich dann am schnellsten prüfen, ob sie den Wert 1 hat?
Delphi-Quellcode:
if i = 1 then
if i > 0 then
if i <> 0 then
Ist eine dieser Versionen schneller, und wenn ja warum? Oder geht es noch schneller?

nahpets 7. Aug 2008 12:15

Re: Welcher Vergleich ist schneller?
 
Hallo,
Delphi-Quellcode:
Case i of
  0 : irgendwas;
  1 : irgendwas;
else
  dasgibtsdochgernicht
end;
Stephan

mkinzler 7. Aug 2008 12:17

Re: Welcher Vergleich ist schneller?
 
Delphi-Quellcode:
if Boolean(i)

Fussball-Robby 7. Aug 2008 12:18

Re: Welcher Vergleich ist schneller?
 
Zitat:

Zitat von nahpets
Delphi-Quellcode:
Case i of
  0 : irgendwas;
  1 : irgendwas;
else
  dasgibtsdochgernicht
end;

Mir gehts um die ausführgeschwindigkeit, d.h. für welchen Vergleich braucht das Program länger, für welchen nicht so lange..

nahpets 7. Aug 2008 12:19

Re: Welcher Vergleich ist schneller?
 
Hallo,

meines wissens ist Case schneller als If-Kaskaden.

Stephan

Dax 7. Aug 2008 12:37

Re: Welcher Vergleich ist schneller?
 
Zitat:

Zitat von mkinzler
Delphi-Quellcode:
if Boolean(i)

In diesem Fall korrekt, aber generell nicht zu empfehlen.

@Thema: Probiers doch einfach aus ;) Ich vermute, dass <> 0 am schnellsten ist (denn es lässt sich in ein test i, i übersetzen).

negaH 7. Aug 2008 13:13

Re: Welcher Vergleich ist schneller?
 
benutze
Delphi-Quellcode:
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
Delphi-Quellcode:
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.

Delphi-Quellcode:
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz