Autor |
Beitrag |
klezmor
      
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Di 15.11.05 19:30
Hallo,
Wenn ich einen boolschenausdruck habe, der zu überprüfen ist und dieser wiederum aus mehreren boolschenausdrücken zusammengesetzt ist mit and oder or gibt es ja mehrere möglichkeiten dies vorzunehmen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| if (z.B.a=true) then begin if (b=true) then begin if (c=true) then begin test; end; end; end; |
oder.
Delphi-Quelltext 1: 2: 3: 4:
| if ((a=true)and(b=true)and(c=true)) then begin test; end; |
was ist der interene unterschied der 2 versionen, gibt es eine schnellere methode oder sind beide intern gleich schnell. Oder gibt es sonstige unterschiede?
Moderiert von Christian S.: Delphi-Tags hinzugefügtModeriert von Christian S.: Topic aus Sonstiges verschoben am Di 15.11.2005 um 18:35
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 15.11.05 19:43
Gemeinsam ist beiden Versionen, dass sie ohne Delphi-Tag grausam aussehen.
Der Unterschied liegt daran, dass das erste Statement vom Compiler schwerer optimiert wird (wenn überhaupt). Bei der zweiten Anweisung bricht nämlich die Auswertung ab, wenn feststeht, dass nicht mehr True rauskommen kann.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
klezmor 
      
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Di 15.11.05 19:59
Was ist ein delphi-tag?
habe deine aussage nicht ganz verstanden, wenn bricht die auswertung ab und wieso ist das eine nicht so optimiert?
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 15.11.05 20:08
klezmor hat folgendes geschrieben: | Was ist ein delphi-tag? |
Sind diese netten Konstruktionen, die freundlicherweise durch die Moderatoren bereits nachgereicht wurden.
@CS: THX.
klezmor hat folgendes geschrieben: | habe deine aussage nicht ganz verstanden, wenn bricht die auswertung ab und wieso ist das eine nicht so optimiert? |
Angenommen, du hast A:=True, B:=False und C:=True;
Im ersten Beispiel wäre die Ausführung If A=true Then, If B = True Then --> Abbruch, da zweite Bedingung nicht erfüllt. Der Compiler macht in diesen Fällen keine Sprungoptimierungen, d.h. das u.U. dein Source etwas größer wird.
Beim zwiten Source macht der Compiler ein If A and B and C Then draus, wobei er and C nur ausführt, wenn er sieht, dass der erste Ausdruck überhaupt gilt. Daher hast Du bei der zweiten Version einen Vergleich weniger drin, was eben (etwas) Zeit spart ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
klezmor 
      
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Di 15.11.05 20:37
Ich hätte das jetzt gerade andersherum gedacht, wenn z.B. a=false ist dann kümmert er sich bei der ersten variante gar nicht mehr um b und c, also müsste doch die erste variante schneller sein, ich verstehe die logik dahinter nicht ganz.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 15.11.05 21:15
Nicht ganz:
Siehe:
1. Variante:
1. Abfrage A=True
2. Abfrage B=True
3. Abfrage C=True
2. Variante:
1. Abfrage A and B=True
2. Abfrage C=True
UC?
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|