![]() |
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:
Ist eine dieser Versionen schneller, und wenn ja warum? Oder geht es noch schneller?
if i = 1 then
if i > 0 then if i <> 0 then |
Re: Welcher Vergleich ist schneller?
Hallo,
Delphi-Quellcode:
Stephan
Case i of
0 : irgendwas; 1 : irgendwas; else dasgibtsdochgernicht end; |
Re: Welcher Vergleich ist schneller?
Delphi-Quellcode:
if Boolean(i)
|
Re: Welcher Vergleich ist schneller?
Zitat:
|
Re: Welcher Vergleich ist schneller?
Hallo,
meines wissens ist Case schneller als If-Kaskaden. Stephan |
Re: Welcher Vergleich ist schneller?
Zitat:
@Thema: Probiers doch einfach aus ;) Ich vermute, dass <> 0 am schnellsten ist (denn es lässt sich in ein test i, i übersetzen). |
Re: Welcher Vergleich ist schneller?
benutze
Delphi-Quellcode:
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ß.
if i <> 0 then
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:
zb. würde dageben so umgesetzt werden müssen
if i == 1 then
[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:
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.
if I > 0 then;
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