AGB  ·  Datenschutz  ·  Impressum  







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

Wie optimiert Delphi?

Ein Thema von nailor · begonnen am 2. Jan 2003 · letzter Beitrag vom 2. Jan 2003
Antwort Antwort
Benutzerbild von nailor
nailor

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

Wie optimiert Delphi?

  Alt 2. Jan 2003, 19:08
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???
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 sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 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');
......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#3
  Alt 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?
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
Brüggendiek

Registriert seit: 13. Dez 2002
Ort: Dortmund
275 Beiträge
 
Delphi 5 Standard
 
#4
  Alt 2. Jan 2003, 22:40
Hallo!

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
Dietmar Brüggendiek
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#5
  Alt 2. Jan 2003, 22:56
Hi,

wenn ich das hier lese, geht mir der Hut hoch, obwohl ich keinen habe. 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).

Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#6
  Alt 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!
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 sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#7
  Alt 2. Jan 2003, 23:33
Zitat von Brüggendiek:
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 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 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.
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Brüggendiek

Registriert seit: 13. Dez 2002
Ort: Dortmund
275 Beiträge
 
Delphi 5 Standard
 
#8
  Alt 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
Dietmar Brüggendiek
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#9
  Alt 2. Jan 2003, 23:58
Zitat von Brüggendiek:
@sakura: Du hattes geschrieben, B+ wäre schneller.
Schlichtweg falsch gelesen!
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.
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:01 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