AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Welcher Vergleich ist schneller?

Ein Thema von Fussball-Robby · begonnen am 7. Aug 2008 · letzter Beitrag vom 7. Aug 2008
Antwort Antwort
Benutzerbild von Fussball-Robby
Fussball-Robby

Registriert seit: 22. Okt 2007
Ort: Nähe Köln
1.063 Beiträge
 
Delphi 7 Enterprise
 
#1

Welcher Vergleich ist schneller?

  Alt 7. Aug 2008, 13:12
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?
Robert L.
Der folgende Satz ist richtig!
Der vorherige Satz ist falsch!

Paradox
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

Re: Welcher Vergleich ist schneller?

  Alt 7. Aug 2008, 13:15
Hallo,
Delphi-Quellcode:
Case i of
  0 : irgendwas;
  1 : irgendwas;
else
  dasgibtsdochgernicht
end;
Stephan
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Welcher Vergleich ist schneller?

  Alt 7. Aug 2008, 13:17
if Boolean(i)
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Fussball-Robby
Fussball-Robby

Registriert seit: 22. Okt 2007
Ort: Nähe Köln
1.063 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Welcher Vergleich ist schneller?

  Alt 7. Aug 2008, 13:18
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..
Robert L.
Der folgende Satz ist richtig!
Der vorherige Satz ist falsch!

Paradox
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

Re: Welcher Vergleich ist schneller?

  Alt 7. Aug 2008, 13:19
Hallo,

meines wissens ist Case schneller als If-Kaskaden.

Stephan
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#6

Re: Welcher Vergleich ist schneller?

  Alt 7. Aug 2008, 13:37
Zitat von mkinzler:
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).
  Mit Zitat antworten Zitat
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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz