Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie optimiert Delphi? (https://www.delphipraxis.net/2009-wie-optimiert-delphi.html)

nailor 2. Jan 2003 19:08


Wie optimiert Delphi?
 
Delphi-Quellcode:
if (var1 = true) and (var2 = true) then
  ShowMessage('Beides wahr');

if var1 = true then
  if var2 = true then
    ShowMessage('Auch beides wahr');
Geht falls var1 und var2 rechenintensive Funktionen sind das zweite schneller, oder merkt Delphi, dass wenn var1 "false" ist das mit dem "and" überhaupt nicht mehr true geben kann???

sakura 2. Jan 2003 19:21

Erst einmal vorneweg. Nie ein Boolean-Variable mit TRUE vergelichen. Also
Delphi-Quellcode:
//anstatt
if blnCheck = True then
// besser einfach
if blnCheck then
Siehe letzter Beitrag in folgendem Thread: http://www.delphipraxis.net/viewtopic.php?t=1667

Nun zu Deinen Varianten. Bei Boolean-Vergleichen mit lokalen Variablen, kann u.U. erstere etwas schneller sein (ca. 5 Taktzyklen). In anderen Situationen (z.B. Klassenvariablen) sind beide Varianten gleich. Letztere ist schneller, wenn Du die Compileroption {$BOOLEVAL ON} bzw. {$B+} gesetzt hast. Standardmäßig sind diese jedoch aus.

Deshalb ist i.A. folgende Variante zu empfehlen
Delphi-Quellcode:
if var1 and var2 then
  ShowMessage('Beides wahr');
...:cat:...

nailor 2. Jan 2003 21:10

und generell bei Operationen, bei denen ab einem bestimmten Zeitpunkt abzusehen ist, das das Ergebnis gleich bleibt, ***-egal, was jetzt noch damit gerechnet wird???

Und was ist, wenn var1 und var2 nicht feststehen, sondern erst errechnet werden müssen. Was weiss ich. Angenommen wenn var1 und var2 Primzahlen sein sollen. Rechnet Delphi dann erst für beide aus, ob es Primzahlen sind, oder "weiß" es, dass wenn die erste keine ist, es mit "and"-Verknüpfung auch kein true geben kann?

Brüggendiek 2. Jan 2003 22:40

Hallo!

Zitat:

Zitat von sakura
Letztere ist schneller, wenn Du die Compileroption {$BOOLEVAL ON} bzw. {$B+} gesetzt hast. Standardmäßig sind diese jedoch aus.

Es ist genau umgekehrt!

Wichtiger Hinweis:
Ist der Compilerschalter B nicht gesetzt ({$B-}), werden Boolean-Ausdrücke grundsätzlich nur ausgewertet, bis das Ergebnis eindeutig ist. Bei AND beendet ein False, bei OR ein True die Auswertung.
Ist der Schalter gesetzt ($B+), wird der Ausdruck immer komplett durchlaufen.

Wenn also
Delphi-Quellcode:
function b1: Boolean;
...
function b2: Boolean;
...

begin
  if b1 and b2 then
  ...
end;
programmiert ist, wird bei B- die Funktion b2 nur aufgerufen, wenn b1 True geliefert hat! Wenn also b2 irgend etwas erledigt, was auf jeden Fall getan werden muß (z.B. beide Funktionen schliessen je eine Datei und liefern True, wenn erfolgreich), sollte B+ gesetzt sein!
Andererseite:
Delphi-Quellcode:
if (Length(satz) >= 5) and (satz [5] <> '#') then
  ..
bereitet bei B- ein kleines Problem, da satz [5] ggf. undefiniert ist! Bei Shortstrings klappt das ja noch, aber normale Strings liefern einen Absturz wegen fehlerhaftem Index. Hier stellt B+ eine Alternative dar. Ist aber irgendwie unsauber! Besser ist:
Delphi-Quellcode:
if Length(satz) >= 5 then
begin
  if satz [5] <> '#' then
    ..
end;
Dann gibt es keine Probleme.

Gruß

Dietmar Brüggendiek

Hansa 2. Jan 2003 22:56

Hi,

wenn ich das hier lese, geht mir der Hut hoch, obwohl ich keinen habe. :spin: Das sind Diskussionen, von 1985 :!: Bei einem Rechner mit 4,77 Mhz Prozessor vielleicht noch sinnvoll. In der Zeit, die ich brauche, das hier zu schreiben, hätte ein heutiger Rechner die Geburtstage aller Bewohner dieses Landes sortiert (falls sie im Hauptspeicher liegen). :mrgreen:

Gruß
Hansa

nailor 2. Jan 2003 22:57

Zitat:

Wichtiger Hinweis:
Ist der Compilerschalter B nicht gesetzt ({$B-}), werden Boolean-Ausdrücke grundsätzlich nur ausgewertet, bis das Ergebnis eindeutig ist. Bei AND beendet ein False, bei OR ein True die Auswertung.
das wars!

sakura 2. Jan 2003 23:33

Zitat:

Zitat von Brüggendiek
Zitat:

Zitat von sakura
Letztere ist schneller, wenn Du die Compileroption {$BOOLEVAL ON} bzw. {$B+} gesetzt hast. Standardmäßig sind diese jedoch aus.

Es ist genau umgekehrt!

Ich bleibe bei meiner Aussage.
Annahme: {$B+}
No. 1
Delphi-Quellcode:
if (var1 = true) and (var2 = true) then
  ShowMessage('Beides wahr');
Es werden grundsätzlich beide Teile ausgewertet!

No. 2
Delphi-Quellcode:
if var1 = true then
  if var2 = true then
    ShowMessage('Auch beides wahr');
Es kann u.U., schon nach dem ersten Test abgebrochen werden.

Daraus folgt
Zitat:

Zitat von sakura
Letztere ist schneller

, ich hätte wohl noch ein u.U. einfügen sollen. Wenn die erste Variabel True ist, dann brauchen beide Statements gleich lange. Bei {$B-} (Standard) brauchen beide generell gleich lang.

Korrigiere mich, wenn ich etwas verpasst habe.

Zitat:

Zitat von "Hansa
Bei einem Rechner mit 4,77 Mhz Prozessor vielleicht noch sinnvoll.

Auch heute noch. Kommt nur darauf an, an welcher Stelle man optimiert. Wird die Stelle hin und wieder genutzt ist es wahrscheinlich übertrieben. Ist das jedoch Teil eines sog. "Bottlenecks", dann kann es durchaus sinnvoll sein.

Brüggendiek 2. Jan 2003 23:52

Hallo!

@sakura: Du hattes geschrieben, B+ wäre schneller. Weil bei B+ alles ausgewertet wird, dauert das natürlich länger als bei B-, wo ggf, verkürzt ausgewertet wird! darauf bezog sich mein Widerspruch.

Nebenbei, B- (Voreinstellung!!) kann natürlich zu schwer zu findenden Fehlern führen! Man merkt, daß die 2. Funktion nie aufgerufen wird und fragt sich, warum. Newbies, die die Compilerschalter (oder Projektoptionen) nicht kennen, stellen dann so komische, nicht nachvollziehbare Fragen (ich hab' ja alles B+, bei mir klappts)!

Gruß

Dietmar Brüggendiek

sakura 2. Jan 2003 23:58

Zitat:

Zitat von Brüggendiek
@sakura: Du hattes geschrieben, B+ wäre schneller.

Schlichtweg falsch gelesen!
Zitat:

Zitat von Sakura
Letztere ist schneller, wenn Du die Compileroption {$BOOLEVAL ON} bzw. {$B+} gesetzt hast

Letztere bezog sich auf die zweite, von Nailor, gezeigte Variante und wie im letzten geschrieben, hätte ein ein u.U. einfügen sollen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:49 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