[gelöst] Was ist schneller/besser?

26. November 2009 11:44

Hallo,
im Forum habe ich auf die folgende Frage noch keine Antwort gefunden:

Was ist schneller/besser:

a)

If (xy) then
if (yz) then
....

oder

b)

if (xy) and (yz) then
....
Zuletzt geändert von rallnus am 26. November 2009 12:04, insgesamt 1-mal geändert.

Re: Was ist schneller/besser?

26. November 2009 11:58

Hallo!

Die erste Variante dürfte schneller sein, da die zweite Bedingung nur ausgewertet wird, wenn die erste zutrifft.

Die zweite Variante ist jedoch leichter zu lesen, da der Programmcode nicht so tief verschachtelt wird.

Re: Was ist schneller/besser?

26. November 2009 12:05

Da war ich wohl zu langsam
Ich würde sagen, dass Version a schneller ist, denn meiner Erfahrung hat gezeigt, dass NAV grundsätzlich alle Teilbedingungen prüft und erst dann logisch verknüpft.

Wenn also xy ein FALSE liefert, wird in Variante b erst yz geprüft, obwohl das Ergebnis des IF durch das falsche xy bereits feststeht. Interessant wird das für die Performance natürlich erst, wenn xy und yz eine gewisse Berechnungszeit erfordern, die sich durch Variante a sparen liese.

Und ob dann
Code:
IF xy THEN
IF yz THEN
oder
Code:
IF yz THEN
IF xy THEN
schneller ist, bleibt separat zu prüfen.


Beste Grüße
Falk

Re: [gelöst] Was ist schneller/besser?

26. November 2009 12:14

Sicher?
(Bezogen auf Timos Antwort, ich war auch zu langsam)

Da jeder Befehl auch eine Funktion für den Compiler darstellt, könnte ich mir vorstellen, das soetwas:
IF (xy) AND (yz) THEN

gleich schnell ist, da weniger Programcode zu verarbeiten ist.
(Ich möchte meinen, das vergleichen der der Argumente verarbeitet der Rechner schneller, als die Codeverarbeitung)

Auch hier müsste es per Test ermittelt werden!

Re: [gelöst] Was ist schneller/besser?

26. November 2009 12:39

mikka hat geschrieben:...
Auch hier müsste es per Test ermittelt werden!

Hab ich eben getan und das Ergebnis ist überraschend deutlich:

Code:

Documentation()

OnRun()
/////////////////////////////////////////////////////////////////////
// Variante a:
/////////////////////////////////////////////////////////////////////
gdtStart := CURRENTDATETIME;

IF A AND B THEN;

MESSAGE('Variante a: %1', CURRENTDATETIME-gdtStart);


/////////////////////////////////////////////////////////////////////
// Variante b:
/////////////////////////////////////////////////////////////////////
gdtStart := CURRENTDATETIME;

IF A THEN
IF B THEN;

MESSAGE('Variante b: %1', CURRENTDATETIME-gdtStart);


/////////////////////////////////////////////////////////////////////
// Variante a1: (ohne aufwendige A und B)
/////////////////////////////////////////////////////////////////////
gdtStart := CURRENTDATETIME;

FOR i := 1 TO 1000000 DO BEGIN
  IF A1 AND B1 THEN;
END;

MESSAGE('Variante a1: %1', CURRENTDATETIME-gdtStart);


/////////////////////////////////////////////////////////////////////
// Variante b1: (ohne aufwendige A und B)
/////////////////////////////////////////////////////////////////////
gdtStart := CURRENTDATETIME;

FOR i := 1 TO 1000000 DO BEGIN
  IF A1 THEN
  IF B1 THEN;
END;

MESSAGE('Variante b1: %1', CURRENTDATETIME-gdtStart);

A() : Boolean
//* Ich hab jetzt mal ganz viel zu tun, das dauert eine Sekunde
SLEEP(1000);
EXIT(FALSE);

B() : Boolean
//* Ich hab auch ganz viel zu tun, das dauert sogar zwei Sekunden
SLEEP(2000);
EXIT(FALSE);

A1() : Boolean
//* Ich habe nicht viel zu tun, ich liefere sofort FALSE
EXIT(FALSE);

B1() : Boolean
//* Ich habe nicht viel zu tun, ich liefere sofort FALSE
EXIT(FALSE);


Variante a und b der CU verdeutlichen, was ich bereits geschrieben hatte. Hat sicher in der Form auch niemand bezweifelt.
Variante a1 und b1 der CU gehen der Frage von mikka nach, und b1 braucht ´nur etwa 40% der Rechenzeit von a1.

[EDIT]
IF FALSE THEN IF FALSE THEN; ist ebenfalls deutlich schneller als IF FALSE AND FALSE THEN;
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: [gelöst] Was ist schneller/besser?

26. November 2009 17:41

Danke Falk,
jetzt kann ich zumindest beruhigt schlafen :-)

Ne mal ehrlich, das habe ich mich auch schon öfters gefragt, habe es aber bisher nie getestet.

- - - Korrektur - - -
Ich habe mich vorhin etwas Missverständlich ausgedrückt.
Mir ging es um die "eigentliche" Verarbeitungsgeschwindigkeit, also wie lange braucht das System um den eigentlichen Befehl zu verarbeiten.
Wenn ich in Falks Beispiel die Werte auf TRUE ändere, muß jede IF Klausel verarbeitet werden, hier ist diese Variante im Vorteil:
IF A1 AND B1 THEN;

Bei dem Beispiel A / B allerdings macht das keinen Sinn, da die Verarbeitung so schnell ist, das immer 3 rauskommt.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.