![]() |
if ... else, 2 mal if oder case ?
Erstmal eine Entschuldigung für den Titel, aber mir fiel einfach kein guter ein, schon gar nicht um 20 nach zehn ...
Also: Ich wüsste gerne, was schneller / effizienter / besser ist: Ich habe 2, sich ausschließende Bedingungen, d.h., es können nicht beide gleichzeitig wahr sein.
Delphi-Quellcode:
oder
if (a = 1) then
begin ... end else if (a = 2) then begin ... end;
Delphi-Quellcode:
oder gar
if (a = 1) then
begin ... end; if (a = 2) then begin ... end;
Delphi-Quellcode:
:gruebel: Fragen über Fragen ... ich hoff' ihr könnt' mir 'ne Antwort sagen ... :mrgreen:
case a of
1: begin ... end; 2: begin ... end; |
Re: if ... else, 2 mal if oder case ?
Die case .. of Abfrage dürfte imho die schnellste sein.
Wenn 2mal if .. then das dauert galub ich länger. Aber ohne Gewähr. ;) |
Re: if ... else, 2 mal if oder case ?
das ganze in
Delphi-Quellcode:
packen, am anfang und am ende gettickcount aufrufen, messagebox ausgeben und die sache sollte gegessen sein. natürlich sollte man hinter das then auch irgendwas hinschreiben, nicht dass der compiler das ganze rausschmeisst ;)
for i:= 0 to ASTRONOMISCH_HOHE_KONSTANTE do
|
Re: if ... else, 2 mal if oder case ?
Wenn man sich das CPU Fenster anschaut, dann würde ich sagen, das if und else if schneller sind.
Ich bevorzuge aber lieber Lösungen die ich schneller lesen und verstehen kann. Und verzichte dann auf Optimierung. |
Re: if ... else, 2 mal if oder case ?
Ich hab mal if.. else if und case verglichen. Einmal der Source dazu:
Delphi-Quellcode:
Stört euch nicht an dem "aBool". Ich hatte es mit Boolschen Typen getestet, aber da waren kleine Probleme beim Case drin, da hab ich für beide Integer genommen, aber die Namen nicht geändert ;)
procedure TForm1.Button1Click(Sender: TObject);
var i, j, k: integer; aBool: integer; begin j := GetTickCount; for i := 0 to 100000 do begin if aBool = 1 then aBool := 0 else aBool := 1; if aBool = 0 then Button1.Caption := 'bla' else if aBool = 1 then Button1.Caption := 'bäh'; end; k := GetTickCount; ShowMessage(IntToStr(k-j)); end; procedure TForm1.Button2Click(Sender: TObject); var i, j, k: integer; aBool: integer; begin j := GetTickCount; for i := 0 to 100000 do begin if aBool = 1 then aBool := 0 else aBool := 1; case aBool of 0: Button2.Caption := 'bla'; 1: Button2.Caption := 'bäh'; end; end; k := GetTickCount; ShowMessage(IntToStr(k-j)); end; Ergebnisse: if.. else if: 6453 case: 6351 Case hat bei meinen Tests zwar immer eine etwas schnellere Geschwindigkeit, allerdings ist das nur minimal (in dieser Größenordnung) ;) Kannst das ja mal fortführen ;) PS: Solche Probleme will ich haben, dass ich mir über sowas Gedanken mach :mrgreen: |
Re: if ... else, 2 mal if oder case ?
eine case anweisung sind einfach hintereinandergestellte ifs.
z.b bei case n of 1: 2: 3: ... 20: end; wenn n 20 ist muss er alle 20 durchgehen. wenn du 20 an erster stelle oder weiter oben hattest dann nicht. er geht die alle sequentiell durch. |
Re: if ... else, 2 mal if oder case ?
nein, bei case-Anweisungen können auch Sprungtabellen erstellt werden.
manchmal ist es sinnvoll, besonders wahrscheinliche pfade schon vorher getrennt abzufangen. das kann im zweifelsfall (sehr geringe mengen) zeit sparen. |
Re: if ... else, 2 mal if oder case ?
Hai jfheins,
in diesem Fall würde ich die Art der Abfrage nicht unbedingt an der Geschwindigkeit anlehnen sondern an der Übersicht. Wenn es wirklich nur zwei Fälle gibt und immer einer von beiden Zutrifft würde ich es so mache:
Delphi-Quellcode:
Ich sehe schon im Code das es nur eine von zwei möglichkeiten geben kann.
if (a = 1) then
begin end else begin end; Wenn es mehr als zwei Fälle gibt würde ich mit CASE Arbeiten:
Delphi-Quellcode:
Das hat beim lesen des Codes den Vorteil das ich genau sehe wo im Code die Entscheidung getroffen wird was bei welchem Wert von "a" was gemacht wird.
case a of
1: begin end; 2: begin end; 7: begin end; end; Wenn man das selbe mit mehreren IFs macht ist dies nicht so schnell zu erkennen. |
Re: if ... else, 2 mal if oder case ?
@Sharky: Wenn die Codeblöcke bei den ifs länger sind (und eventuell auch noch weiter verschachtelt) würde ich es der Übersicht halber so machen:
Delphi-Quellcode:
Ich hab nämlich ein ähnliches Übersichtproblem bei einem meiner momentanen Projekte. Da mach ich bei den Else-Blöcken immer ein zusätzliches if rein, damit man direkt weiß, zu welchem if das else gehört ;)
if (a = 1) then
begin machWas; machWas; machWas; machWas; machWas; end else if (a = 2) then //... |
Re: if ... else, 2 mal if oder case ?
@nailor: Leider compiliert Delphi keine Sprungtabellen. Wenn dem so wäre, dann würde Delphi ...
1. meckern, wenn die CASE-Bedingungen einen sehr grossen Zahlenraum abbilden. Wenn Du z.B.
Delphi-Quellcode:
schreibst, wäre die Sprungtabelle verdammt gross.
Case Foo of
-maxint : Bar; maxint : Sockenshoos; End; 2. Würde der Debugger beim Steppen nicht durch die CASE-Anweisungen wandern. 3. Würde der ASM-Code auch irgendwie anders aussehen. 3 habe ich nicht gecheckt, zu 1 fällt mir der UCSD-Compiler aus den 70er Jahren des vorigen Jahrhunderts ein und zu 2 nix weil sonnenklar. Ich bin kein Compiler-Profi, könnte mir aber vorstellen, das man so ein CASE variabel compilieren könnte. Ist der Zahlenraum (und damit die resultierende Sprungtabelle) halbwegs übersichtlich, kämen Jumptables, ansonsten IF...ELSE Konstrukte in Betracht. Warum Delphi das offensichtlich nicht macht, ist mir ein Rätsel. Die Frage (Was ist schneller) ist wirklich nur von theoretischer Bedeutung, aber ich möchte wissen, WIE mein Compiler übersetzt. Das Detail hier ist unwichtig, aber dennoch sehr interessant. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:41 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