Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.419 Beiträge
 
Delphi 7 Professional
 
#2

AW: Möglichkeiten Code zu optimieren (z.B. Laufzeit verringern)

  Alt 20. Nov 2021, 18:46
Mal ein Beispiel aus meinem Fraktalgenerator:

Zuerst das Original:
Delphi-Quellcode:
FUNCTION Formel101(a : Extended;
                   b : Extended;
                   Faktor : Extended;
                   Iteration : Longint;
                   Art : Integer ):LongInt;
VAR x,y,z : Extended;
    Farbe : INTEGER;
BEGIN (* Apfelmann mit Spitze nach links *)
  x := 0;
  y := 0;
  Farbe := 0;
  REPEAT
    z := x * x - y + y + 2 * a; // x² - y² + 2a
    y := 2 * x * y + 3 * b; // 2 * x * y + 3b
    x := z;
    Farbe := Farbe + 1;
  UNTIL (Farbe = Iteration) OR (x * x + y * y > Faktor);
  Formel101 := GetFarbe(Farbe,x * x,y * y,x * y,Iteration,art);
END;
und dann die schnellere Methode:
Delphi-Quellcode:
FUNCTION Formel101(a : Extended;
                   b : Extended;
                   Faktor : Extended;
                   Iteration : Longint;
                   Art : Integer ):LongInt;
VAR x,y,z : Extended;
    aa, bb : Extended;
    xx,yy : Extended;
    xy : Extended;
    Farbe : INTEGER;
BEGIN (* Apfelmann mit Spitze nach links *)
  x := 0;
  y := 0;
  Farbe := 0;
  aa := a + a;
  bb := b + b + b;
  xx := 0;
  yy := 0;
  REPEAT
    z := xx - yy + aa; // x² - y² + 2a
    xy := x * y;
    y := xy + xy + bb; // 2 * x * y + 3b
    x := z;
    xx := x * x;
    yy := y * y;
    Farbe := Farbe + 1;
  UNTIL (Farbe = Iteration) OR (xx + yy > Faktor);
  Formel101 := GetFarbe(Farbe,xx,yy,xy,Iteration,art);
END;
Wenn's um Rechnerei geht, kann man eigentlich recht pauschal sagen:

Alle Berechnungen, deren Ergebnis mehr als einmal benötigt wird, wird nur einmal berechnet und das Ergebnis in einer Variabel gespeichert. Danach wird statt der Berechnung die Variabel genommen.

Der Geschwindigkeitsvorteil kann dann schonmal (je nach Komplexität) um die 25% (wenn man Glück hat aber auch deutlich mehr) betragen.

Bei Grafikbearbeitung ist es hilfreich, für die Zeit der Berechnung alle Bildschirmaktuallisierungen zu deaktivieren. Ggfls. das Programm zu Beginn der Berechnung minimieren und am Ende der Berechnung wieder auf die normale Größe bringen.

Das langsamste bei der Grafikbearbeitung ist halt die Darstellung auf dem Bildschirm.
  Mit Zitat antworten Zitat