Autor |
Beitrag |
Hochhaus
      
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Di 12.06.12 16:21
Hallo allerseits !
ich hatte die Idee, die mathematische Performance von Delphi zu testen. Und siehe da: Delphi 6 Professional ist bei aufwändigen Mathe-Problemen deutlich schneller, als der Code von Delphi XE2. Ich stellte einen Performance-Verlust von ca. einem Faktor 1.4 fest. Konkret habe ich die Quadratwurzel von 2 gezogen. Und siehe da, Delphi 6 Professional brauchte dafür auf einem Core I7-Prozessor 40 msec., aber Delphi XE2 ca. 56 msec.
Dies ist an und für sich keine Tragödie, aber doch unschön.- Was ist Eure Meinung ? Habt Ihr dieselbe Erfahrung auch gemacht ?
Gruss,
Hochhaus
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Di 12.06.12 16:28
Liegt das wirklich an den Berechnungen, oder z.B. an der Ausgabe als String?
_________________ We are, we were and will not be.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Di 12.06.12 16:30
Hallo,
50 Millisekunden sind etwas wenig für einen Performance-Test, ich würde die Anzahl der Durchläufe erhöhen, bis es ein paar Sekunden braucht. Und hast du die Programme auch außerhalb des Debuggers gestartet, also die generierte Exe-Datei selbst?
Wenn wirklich ein Unterschied besteht, müsste der im Assembler-Code zu finden sein. In Delphi kannst du das CPU-Fenster aufrufen, dann einen Haltepunkt im Code setzten, damit du siehst, wo der interessante Code ist. Kann aber sein, dass der dann noch nicht vollständig optimiert ist.
Grüße,
Yogu
Für diesen Beitrag haben gedankt: Hochhaus
|
|
Gammatester
      
Beiträge: 328
Erhaltene Danke: 101
|
Verfasst: Di 12.06.12 16:37
50 ms? Und das soll auch noch wenig sein. Auf meinen Celereon 500Mhz brauche ich für 1Mio Berechnungen gerade mal 0.26s, also pro sqrt 0.26 µs!
|
|
Hochhaus 
      
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Di 12.06.12 16:39
Yogu hat folgendes geschrieben : | Hallo,
50 Millisekunden sind etwas wenig für einen Performance-Test, ich würde die Anzahl der Durchläufe erhöhen, bis es ein paar Sekunden braucht. Und hast du die Programme auch außerhalb des Debuggers gestartet, also die generierte Exe-Datei selbst?
Grüße,
Yogu |
Ich habe die EXE-Dateien (ohne Debugger) direkt aufgerufen. Selbstverständlich habe ich die Stellenzahl auch deutlich erhöht, dann ist das Verhältnis 4 sec. zu 5.6 sec.
Hochhaus
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 12.06.12 16:44
Es kommt auch darauf an die Datentypen günstig zu wählen, also nicht sowas wie Single oder sogar Extended.
Wie sieht der Code denn aus? Wie wäre es mit einem Demoprojekt? 
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Di 12.06.12 16:46
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| program Project1; {$apptype console} uses Windows; const COUNT = 1000*1000*1000; var f,t1,t2: Int64; ttttt: Double; i: integer; begin QueryPerformanceFrequency(f); QueryPerformanceCounter(t1); for i:= 0 to COUNT-1 do begin end; QueryPerformanceCounter(t2); WriteLn('Calibrate: ',((t2-t1)/f)/COUNT * 1000000,'ns');
QueryPerformanceCounter(t1); for i:= 0 to COUNT-1 do begin ttttt:= sqrt(2); end; QueryPerformanceCounter(t2); WriteLn('Run: ',((t2-t1)/f)/COUNT * 1000000,'ns'); ReadLn; end. |
stdout 1: 2:
| Calibrate: 4.51228689679834E-0003ns Run: 1.96267299335530E-0002ns |
Yogu hat folgendes geschrieben : | Wenn wirklich ein Unterschied besteht, müsste der im Assembler-Code zu finden sein. In Delphi kannst du das CPU-Fenster aufrufen, dann einen Haltepunkt im Code setzten, damit du siehst, wo der interessante Code ist. |
Viel zu optimieren gibts da nicht.
Quelltext 1: 2: 3: 4: 5:
| Project1.dpr.15: ttttt:= sqrt(2); 004043C7 DB2D60444000 fld tbyte ptr [$00404460] 004043CD D9FA fsqrt 004043CF DD1D7C664000 fstp qword ptr [ttttt] 004043D5 9B wait |
Außer natürlich direkt FLD auf eine Konstante mit der 1.4142135623730952 
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Hochhaus 
      
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Di 12.06.12 16:53
jaenicke hat folgendes geschrieben : | Es kommt auch darauf an die Datentypen günstig zu wählen, also nicht sowas wie Single oder sogar Extended.
Wie sieht der Code denn aus? Wie wäre es mit einem Demoprojekt?  |
Ist als Zip-Datei in der Beilage.
Hochhaus
Einloggen, um Attachments anzusehen!
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Di 12.06.12 17:08
Achsooo, Arbitrary Precision (naja, mehr oder weniger fixed)
Solange da ein ProcessMessages drin ist, würde ich dem nicht weiter trauen als ich meinen Computer werfen würde.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Für diesen Beitrag haben gedankt: Hochhaus
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 12.06.12 17:09
XE und XE2 (ich weiß nicht welche noch) binden den Sqrt Befehl soweit ich mich erinnere nicht inline ein. Das könnte der Grund sein, dass es etwas langsamer ist, wenn es denn tatsächlich an dieser einen Funktion liegt. Da da noch ziemlich viel Kuddelmuddel drum ist in dem Projekt, taugt das ja eh nicht zur Geschwindigkeitsmessung (habs nur kurz überflogen, genauer kann ich heute Abend schauen...).
Für diesen Beitrag haben gedankt: Martok
|
|
Blup
      
Beiträge: 174
Erhaltene Danke: 43
|
Verfasst: Di 12.06.12 17:13
Delphi 2007
Calibrate: 3.52052285974893E-0004ns
Run: 3.53167198624406E-0002ns
Quelltext 1: 2: 3: 4: 5: 6:
| Project1.dpr.22: ttttt:= sqrt(2); 0040515E 6800400000 push $00004000 00405163 6800000080 push $80000000 00405168 6A00 push $00 0040516A E821DCFFFF call Sqrt 0040516F DDD8 fstp st(0) |
Für diesen Beitrag haben gedankt: Martok
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 12.06.12 17:14
Dann ist es da ja auch schon ohne inline Sqrt. Lustig ist übrigens wie der Befehl bei XE aussieht: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function Sqrt(const X: Extended): Extended; {$IFDEF CPU386} asm FLD X FSQRT FWAIT end; {$ELSE} begin Result := 0; end; {$ENDIF} |
// EDIT:
Ach ja: Inline ist es nicht, weil es eine Assemblerfunktion ist. Sowas lässt sich in Delphi nicht inline einbinden.
Für diesen Beitrag haben gedankt: Hochhaus
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Di 12.06.12 17:39
In D7 ist das nicht mal eine Pseudofunktion in System.pas, sondern anscheinend direkt Magic.
Und dass Delphi sich beim inlinen doof hat stört mich auch schon länger... Mal sehen, nächstes Jahr um die Zeit gibts vielleicht ein bis dahin brauchbares FPC-Kompatibles LLVM-Frontend. Der würde dann die Schleife gleich komplett rausoptimieren 
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Hochhaus 
      
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Di 12.06.12 19:05
jaenicke hat folgendes geschrieben : | XE und XE2 (ich weiß nicht welche noch) binden den Sqrt Befehl soweit ich mich erinnere nicht inline ein. Das könnte der Grund sein, dass es etwas langsamer ist, wenn es denn tatsächlich an dieser einen Funktion liegt. Da da noch ziemlich viel Kuddelmuddel drum ist in dem Projekt, taugt das ja eh nicht zur Geschwindigkeitsmessung (habs nur kurz überflogen, genauer kann ich heute Abend schauen...). |
Mein einfaches Primzahlenprogramm ist nur ca. 10 % langsamer unter Delphi XE2, verglichen mit Delphi 6. Es scheint sehr stark von den verwendeten Funktionen abzuhängen ...
Hochhaus
|
|