![]() |
Wie optimiert Delphi?
Delphi-Quellcode:
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???
if (var1 = true) and (var2 = true) then
ShowMessage('Beides wahr'); if var1 = true then if var2 = true then ShowMessage('Auch beides wahr'); |
Erst einmal vorneweg. Nie ein Boolean-Variable mit TRUE vergelichen. Also
Delphi-Quellcode:
Siehe letzter Beitrag in folgendem Thread:
//anstatt
if blnCheck = True then // besser einfach if blnCheck then ![]() 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:
...:cat:...
if var1 and var2 then
ShowMessage('Beides wahr'); |
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? |
Hallo!
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. Ist der Schalter gesetzt ($B+), wird der Ausdruck immer komplett durchlaufen. Wenn also
Delphi-Quellcode:
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!
function b1: Boolean;
... function b2: Boolean; ... begin if b1 and b2 then ... end; Andererseite:
Delphi-Quellcode:
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:
if (Length(satz) >= 5) and (satz [5] <> '#') then
..
Delphi-Quellcode:
Dann gibt es keine Probleme.
if Length(satz) >= 5 then
begin if satz [5] <> '#' then .. end; Gruß Dietmar Brüggendiek |
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 |
Zitat:
|
Zitat:
Annahme: {$B+} No. 1
Delphi-Quellcode:
Es werden grundsätzlich beide Teile ausgewertet!
if (var1 = true) and (var2 = true) then
ShowMessage('Beides wahr'); No. 2
Delphi-Quellcode:
Es kann u.U., schon nach dem ersten Test abgebrochen werden.
if var1 = true then
if var2 = true then ShowMessage('Auch beides wahr'); Daraus folgt Zitat:
Korrigiere mich, wenn ich etwas verpasst habe. Zitat:
|
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 |
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:02 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 by Thomas Breitkreuz