Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi if ... else, 2 mal if oder case ? (https://www.delphipraxis.net/47057-if-else-2-mal-if-oder-case.html)

jfheins 5. Jun 2005 21:27


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:
if (a = 1) then
begin
...
end
else
if (a = 2) then
begin
...
end;
oder
Delphi-Quellcode:
if (a = 1) then
begin
...
end;

if (a = 2) then
begin
...
end;
oder gar
Delphi-Quellcode:
case a of
1:
begin
...
end;

2:
begin
...
end;
:gruebel: Fragen über Fragen ... ich hoff' ihr könnt' mir 'ne Antwort sagen ... :mrgreen:

PierreB 5. Jun 2005 21:31

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. ;)

DGL-luke 5. Jun 2005 21:39

Re: if ... else, 2 mal if oder case ?
 
das ganze in
Delphi-Quellcode:
for i:= 0 to ASTRONOMISCH_HOHE_KONSTANTE do
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 ;)

Sprint 5. Jun 2005 21:45

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.

malo 5. Jun 2005 21:48

Re: if ... else, 2 mal if oder case ?
 
Ich hab mal if.. else if und case verglichen. Einmal der Source dazu:

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

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:

simonko 5. Jun 2005 23:22

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.

nailor 5. Jun 2005 23:26

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.

Sharky 6. Jun 2005 06:36

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:
if (a = 1) then
  begin
  end
else
  begin
  end;
Ich sehe schon im Code das es nur eine von zwei möglichkeiten geben kann.

Wenn es mehr als zwei Fälle gibt würde ich mit CASE Arbeiten:
Delphi-Quellcode:
case a of
  1:
  begin
  end;
  2:
  begin
  end;
  7:
  begin
  end;
end;
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.

Wenn man das selbe mit mehreren IFs macht ist dies nicht so schnell zu erkennen.

malo 6. Jun 2005 06:56

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:
if (a = 1) then
  begin
    machWas;
    machWas;
    machWas;
    machWas;
    machWas;
  end
else if (a = 2) then
  //...
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 ;)

alzaimar 6. Jun 2005 07:26

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:
Case Foo of
  -maxint : Bar;
   maxint : Sockenshoos;
  End;
schreibst, wäre die Sprungtabelle verdammt gross.
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.
Seite 1 von 2  1 2      

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