AGB  ·  Datenschutz  ·  Impressum  







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

if ... else, 2 mal if oder case ?

Ein Thema von jfheins · begonnen am 5. Jun 2005 · letzter Beitrag vom 6. Jun 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#1

if ... else, 2 mal if oder case ?

  Alt 5. Jun 2005, 22:27
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;
Fragen über Fragen ... ich hoff' ihr könnt' mir 'ne Antwort sagen ...
  Mit Zitat antworten Zitat
PierreB
(Gast)

n/a Beiträge
 
#2

Re: if ... else, 2 mal if oder case ?

  Alt 5. Jun 2005, 22:31
Die case .. of Abfrage dürfte imho die schnellste sein.
Wenn 2mal if .. then das dauert galub ich länger.

Aber ohne Gewähr.
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#3

Re: if ... else, 2 mal if oder case ?

  Alt 5. Jun 2005, 22:39
das ganze in 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
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#4

Re: if ... else, 2 mal if oder case ?

  Alt 5. Jun 2005, 22:45
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.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#5

Re: if ... else, 2 mal if oder case ?

  Alt 5. Jun 2005, 22:48
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
  Mit Zitat antworten Zitat
simonko

Registriert seit: 2. Jun 2005
125 Beiträge
 
#6

Re: if ... else, 2 mal if oder case ?

  Alt 6. Jun 2005, 00:22
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.
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#7

Re: if ... else, 2 mal if oder case ?

  Alt 6. Jun 2005, 00:26
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.
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#8

Re: if ... else, 2 mal if oder case ?

  Alt 6. Jun 2005, 07:36
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.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#9

Re: if ... else, 2 mal if oder case ?

  Alt 6. Jun 2005, 07:56
@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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: if ... else, 2 mal if oder case ?

  Alt 6. Jun 2005, 08:26
@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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 10:40 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