Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Buddhabrot (https://www.delphipraxis.net/54146-buddhabrot.html)

Eichhoernchen 10. Okt 2005 18:27

Re: Buddhabrot
 
hmmm ich hab das mal so getestet mit den units von dizzy und selbst geschriebenes Zeugs.

Ich muss sagen dissys Zeug ist in der Handhabung echt klasse, jedoch ist es langsamer musste ich feststellen.
Was sich bei meiner Berechnung in 1ner Sekunde ausschlägt, so wie ich es geschrieben hab dauerte die Rechnung ca 5 sekunden und mit dizzys Befehlen brauchte sie ca 6 sekunden.
Ich habe anstatt z.B.:

sqrC(c) das hier geschrieben:

Delphi-Quellcode:
c.x := c.x * c.x - c.y * c.y;
c.y := 2 * c.x * c.y;
und es ist schneller, woran liegt das, ich meine dizzys Zeug ist doch fast alles in asm geschrieben.
Außerdem ist auch das normale quadieren mit sqr langsamer als x * x zu rechnen. Kann mir das einer erklären, oder liegt es einfach daran das ich ne funktion aufrufe und das die Zeit nimmt?

Khabarakh 10. Okt 2005 20:16

Re: Buddhabrot
 
Zitat:

Delphi-Quellcode:
c.x := c.x * c.x - c.y * c.y;
c.y := 2 * c.x * c.y;

So wird das aber nichts :wink: :
Delphi-Quellcode:
TempX := z.x;
z.x := z.x * z.x - z.y * z.y;
z.y := 2 * TempX * z.y;
Ich habe mir mal eine Testanwendung geschrieben, im Schnitt kamen überall etwa die gleichen Zeiten heraus (CSqr eher langsamer).
Delphi-Quellcode:
function sqrC(const C: TComplex): TComplex;
const two: double = 2.0;
asm
  fld C.x;
  fmul C.x;
  fld C.y;
  fmul C.y;
  fsubp;
  fstp result.x;

  fld C.x;
  fmul C.y;
  fmul two;
  fstp result.y;
end;

function CSqr(const C: TComplex): TComplex; inline;
begin
  Result.x := Sqr(C.x) - Sqr(C.y);
  Result.y := 2 * C.x * C.y;
end;

procedure CSqr2(var C: TComplex); inline;
var
  TempX: Single;
begin
  TempX := C.x;
  C.x := C.x * C.x - C.y * C.y;
  C.y := 2 * TempX * C.y;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Start: Cardinal;
  i, ii: Integer;
  TempX: Single;
  z: TComplex;
begin
  Start := GetTickCount;
  for ii := 0 to 1000000 do
  begin
    z.x := Sqrt(0.5);
    z.y := Sqrt(0.5);
    for i := 0 to 50 do
      z := sqrC(z);
  end;
  ShowMessage(Format('%d', [GetTickCount - Start]));

  Start := GetTickCount;
  for ii := 0 to 1000000 do
  begin
    z.x := Sqrt(0.5);
    z.y := Sqrt(0.5);
    for i := 0 to 50 do
      z := CSqr(z);
  end;
  ShowMessage(Format('%d', [GetTickCount - Start]));

  Start := GetTickCount;
  for ii := 0 to 1000000 do
  begin
    z.x := Sqrt(0.5);
    z.y := Sqrt(0.5);
    for i := 0 to 50 do
    begin
      TempX := z.x;
      z.x := z.x * z.x - z.y * z.y;
      z.y := 2 * TempX * z.y;
    end;
  end;
  ShowMessage(Format('%d', [GetTickCount - Start]));

  Start := GetTickCount;
  for ii := 0 to 1000000 do
  begin
    z.x := Sqrt(0.5);
    z.y := Sqrt(0.5);
    for i := 0 to 50 do
      CSqr2(z);
  end;
  ShowMessage(Format('%d', [GetTickCount - Start]));

end;

dizzy 10. Okt 2005 22:18

Re: Buddhabrot
 
Zitat:

Zitat von Eichhoernchen
Kann mir das einer erklären, oder liegt es einfach daran das ich ne funktion aufrufe und das die Zeit nimmt?

Genau daran wird es wohl liegen. Deinen Code schreibst du direkt in die Schleife, wärend du im anderen Fall einen Funktionsaufruf hast, der leider etwas Overhead erzeugt. Der Gewinn ist bei der Lesbarkeit und Wiederverwendbarkeit. Ich bemängel jedoch schon länger, dass Delphi im Gegensatz zu C kein Inlining unterstützt womit beide Fliegen mit einer Klappe geschlagen wären. (Jaja, D2005 kann das, aber das hab ich nicht und will es nicht ;).)

In Khabarakhs Messung kommen beide Varianten auf fast gleiche Ergebnisse, weil auch beides in Funktionen ausgelagert ist. Zudem ist mein asm-code nicht so viel anders als der den Delphi aus deinem generiert. Mir fielen da nur gelegentlich kleine Dinge auf die nicht 100%ig optimal waren, und deshalb hatte ich gleich alles was ich konnte in asm gebaut. Da weiss man wenigstens was man hat ^^

\\edit: Khabarakh, du hast die asm-funktion nicht ge-inlined ;)

Khabarakh 12. Okt 2005 13:37

Re: Buddhabrot
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von dizzy
\\edit: Khabarakh, du hast die asm-funktion nicht ge-inlined ;)

Inlining wird für Assembler-Routinen nicht unterstützt :wink: . Ich mache heute noch einen größeren Test, dann werde ich sie auch per Hand inlinen.

Hab gerade die neueste Version meines MathBitmaps hochgeladen, zusammen mit der Unit im Anhang (und natürlich der GR32-Lib) sollte sich mein Programm nun kompilieren lassen.

Eichhoernchen 12. Okt 2005 21:36

Re: Buddhabrot
 
Zitat:

Zitat von Khabarakh
Zitat:

Delphi-Quellcode:
c.x := c.x * c.x - c.y * c.y;
c.y := 2 * c.x * c.y;

So wird das aber nichts :wink: :
Delphi-Quellcode:
TempX := z.x;
z.x := z.x * z.x - z.y * z.y;
z.y := 2 * TempX * z.y;

Jaja, aber man wusste was ich meinte^^

Habe mir jetzt ma gr32 und Konsorten besorgt und ich muss sagen: Nicht schlächt...



Hmm es müsste mal ne Delphi version im Stil von D 5,6,7 rauskommen die aber solche "mängel" beseitigt.
Ich hab mir die D2005 Demo gerade von der Borland Website geladen und ich muss sagen: Wer da beim Start nicht einschlaft....
Und die Oberfläche ist kacke, nicht mehr so schön freischwebend, kann man zwar umstellen, ist aber nicht genauso.
Fazit: Neues Delphi 7 mit verbessertem Compiler^^ (da kann ich lange drauf warte)


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:22 Uhr.
Seite 4 von 4   « Erste     234   

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-2025 by Thomas Breitkreuz