Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi 64 Bit langsamer als 32 Bit (https://www.delphipraxis.net/176010-delphi-64-bit-langsamer-als-32-bit.html)

BigAl 6. Aug 2013 14:28

Delphi 64 Bit langsamer als 32 Bit
 
Hallo,

ich bin gerade am Schreiben einer sehr umfangreichen Anwendung. Im Zuge von diversen Optimierungen habe ich einige Messungen durchgeführt. Leider fällt mir immer wieder auf, dass die 32 Bit Variante schneller ist als die 64 Bit Variante. Bei den von mir eingesetzten Typen handelt es sich im Normalfall immer um klassische "Integer" etc. Diese sollten ja den nativen Type der Umgebung entsprechen.

Ein Beispiel: Ich diskretisiere Objekte für eine finite Elemente Simulation. Ein Testobjekt mit 36 Kanten wird auf ca. 270.000 Kanten diskretisiert. Hierbei werden sehr viele Berechnungen durchgeführt (Matrizen, Volumen, Längen, Flächen etc.), aber auch sehr viele Indexoperationen mit dynamischen Arrays (array of Integer). Als 32-Bit benötigt der Diskretisierungsvorgang ca. 24,58 Sekunden. Als 64-Bit Anwendung werden ca. 28,21 Sekunden benötigt (absolut reproduzierbar). Das klingt jetzt nicht nach viel, aber die Objekte werden später wesentlich komplexer und umfangreicher, was die benötigte Zeit vervielfacht...

Hat irgendjemand eine Idee, warum die 64 Bit Anwendungen langsamer sind als die 32 Bit Anwendungen?

Viele Grüße

Alex

Der schöne Günther 6. Aug 2013 14:34

AW: Delphi 64 Bit langsamer als 32 Bit
 
Ich würde sagen weil die Register in deiner CPU nicht größer geworden sind. Webbrowser sind (glaube ich) bis heute größtenteils immer noch 32 Bit, da es sich einfach nicht lohnt bzw. sogar eben langsamer wird.

jfheins 6. Aug 2013 14:53

AW: Delphi 64 Bit langsamer als 32 Bit
 
Zitat:

Bei den von mir eingesetzten Typen handelt es sich im Normalfall immer um klassische "Integer" etc. Diese sollten ja den nativen Type der Umgebung entsprechen.
Integer sind eigentlich immer 32bit groß. Von 16 auf 32 bit wurden sie noch erweitert, danach sah man da keinen Sinn mehr drin.

Sir Rufo 6. Aug 2013 14:54

AW: Delphi 64 Bit langsamer als 32 Bit
 
Delphi-Referenz durchsuchenSystem.Integer ist immer 32bit (x32,x64)
Was du meinst/suchst ist Delphi-Referenz durchsuchenSystem.NativeInt

Namenloser 6. Aug 2013 14:55

AW: Delphi 64 Bit langsamer als 32 Bit
 
Mit den Registern sollte es nichts zu tun haben, die sind unter einer 64Bit-CPU immer 64Bit breit und werden im 32Bit-Modus einfach nur zur Hälfte genutzt.

Ich vermute eher, dass es am Cache liegt: Unter 64Bit sind viele Datentypen doppelt so groß wie unter 32Bit, aber der Cache der CPU ist in beiden Modi gleich groß → unter 64Bit passt weniger in den Cache → mehr Cache-Faults.

gammatester 6. Aug 2013 15:10

AW: Delphi 64 Bit langsamer als 32 Bit
 
Zitat:

Zitat von NamenLozer (Beitrag 1223727)
Mit den Registern sollte es nichts zu tun haben, die sind unter einer 64Bit-CPU immer 64Bit breit und werden im 32Bit-Modus einfach nur zur Hälfte genutzt.

Es könnte auch an Registern liegen, wenn viel multipliziert wird. Das Produkt von zwei 32-Bit-Integern hat halt nicht mehr als 64-Bit, das von zwei 64-Bit-Integern schon. Vielleicht sieht man ja am erzeugten Code mehr.

BUG 6. Aug 2013 15:32

AW: Delphi 64 Bit langsamer als 32 Bit
 
Zitat:

Zitat von Sir Rufo (Beitrag 1223726)
Delphi-Referenz durchsuchenSystem.Integer ist immer 32bit (x32,x64)

Aber Pointer/Objektreferenzen sind jetzt 64 Bit lang; wenn man viele Klassen/Referenzen (z.B. in Baumstrukturen) benutzt, führt dass zu einem bis zu doppelt so hohem Speicherverbrauch, was das Programm ausbremsen kann.
Ich nehme aber an, dass in deiner numerischen Berechnung nicht so viele Zeiger/Objekte benutzt werden.

Union 6. Aug 2013 15:43

AW: Delphi 64 Bit langsamer als 32 Bit
 
Ich würde das mal profilen, runter bis zur RTL. Erst dann kann man eine konkrete Aussage treffen woran es liegt. Alles andere ist geraten.

Perlsau 7. Aug 2013 01:16

AW: Delphi 64 Bit langsamer als 32 Bit
 
Zitat:

Zitat von Sir Rufo (Beitrag 1223726)
Delphi-Referenz durchsuchenSystem.Integer ist immer 32bit (x32,x64)
Was du meinst/suchst ist Delphi-Referenz durchsuchenSystem.NativeInt

Kann man das so interpretieren, daß eine 64-Bit-Anwendung, wenn man int64 statt Integer einsetzt, schneller wird?

Namenloser 7. Aug 2013 02:46

AW: Delphi 64 Bit langsamer als 32 Bit
 
Zitat:

Zitat von Perlsau (Beitrag 1223772)
Zitat:

Zitat von Sir Rufo (Beitrag 1223726)
Delphi-Referenz durchsuchenSystem.Integer ist immer 32bit (x32,x64)
Was du meinst/suchst ist Delphi-Referenz durchsuchenSystem.NativeInt

Kann man das so interpretieren, daß eine 64-Bit-Anwendung, wenn man int64 statt Integer einsetzt, schneller wird?

Ist nicht zu erwarten, nein. Nach dem Thread hier zu urteilen wird es eher langsamer.

jaenicke 7. Aug 2013 05:57

AW: Delphi 64 Bit langsamer als 32 Bit
 
Zitat:

Zitat von Perlsau (Beitrag 1223772)
Kann man das so interpretieren, daß eine 64-Bit-Anwendung, wenn man int64 statt Integer einsetzt, schneller wird?

Es ist so oder so ein Assemblerbefehl, ob man das halbe 64-Bit Register ausliest oder das ganze. Bei 64-Bit Werten ist es allerdings ein Assemblerbefehl mehr als mit Integer was z.B. bei einer Addition herauskommt.
Integer unter 64-Bit: der erste Wert wird aus dem Stack in ein Register geladen und der zweite mit add direkt aus dem Stack hinzuaddiert
Int64 uner 64-Bit: beide Werte werden aus dem Stack in Register geladen und dann addiert

Insgesamt generiert der 64-Bit Compiler eher mehr Assemblerbefehle als der 32-Bit Compiler. Was aber wirklich die Performance reduziert, ist, dass die aktuellen Planungen dazu führen, dass eher reines Object Pascal benutzt wird. Das heißt wo es für 32-Bit assembleroptimierte Routinen gab, ist das für 64-Bit in der Regel nicht mehr so, insbesondere bei Stringroutinen. Das kostet allerdings selbst bei Benchmark oft nur wenige Prozentpunkte, so viel langsamer ist das meistens nicht.
Schneller ist man bei 64-Bit, wenn es um viele Fließkommaoperationen geht. Solche Berechnungen sind durch die Multimedia-Befehle der CPU deutlich schneller.

Dass 64-Bit oft langsamer ist, ist aber nicht nur bei Delphi so, das sieht man auch bei Java oder C++ z.B., aber der Irrglaube, dass man unbedingt 64-Bit braucht und da alles besser ist, hält sich leider (auch bei manchen hier im Forum) hartnäckig. In der Realität ist es für den Großteil der Projekte aber eher ein Nachteil.

Perlsau 7. Aug 2013 06:16

AW: Delphi 64 Bit langsamer als 32 Bit
 
Zitat:

Zitat von jaenicke (Beitrag 1223774)
[Es ist so oder so ein Assemblerbefehl, ob man das halbe 64-Bit Register ausliest oder das ganze. Bei 64-Bit Werten ist es allerdings ein Assemblerbefehl mehr als mit Integer was z.B. bei einer Addition herauskommt.
Integer unter 64-Bit: der erste Wert wird aus dem Stack in ein Register geladen und der zweite mit add direkt aus dem Stack hinzuaddiert
Int64 uner 64-Bit: beide Werte werden aus dem Stack in Register geladen und dann addiert
Insgesamt generiert der 64-Bit Compiler eher mehr Assemblerbefehle als der 32-Bit Compiler. Was aber wirklich die Performance reduziert, ist, dass die aktuellen Planungen dazu führen, dass eher reines Object Pascal benutzt wird. Das heißt wo es für 32-Bit assembleroptimierte Routinen gab, ist das für 64-Bit in der Regel nicht mehr so, insbesondere bei Stringroutinen. Das kostet allerdings selbst bei Benchmark oft nur wenige Prozentpunkte, so viel langsamer ist das meistens nicht.
Schneller ist man bei 64-Bit, wenn es um viele Fließkommaoperationen geht. Solche Berechnungen sind durch die Multimedia-Befehle der CPU deutlich schneller.

Vielen Dank, Jaenicke, das war mal wieder sehr informativ ... wie man das halt von dir gewohnt ist :thumb:

Zitat:

Zitat von jaenicke (Beitrag 1223774)
Dass 64-Bit oft langsamer ist, ist aber nicht nur bei Delphi so, das sieht man auch bei Java oder C++ z.B., aber der Irrglaube, dass man unbedingt 64-Bit braucht und da alles besser ist, hält sich leider (auch bei manchen hier im Forum) hartnäckig. In der Realität ist es für den Großteil der Projekte aber eher ein Nachteil.

Genau deshalb wollte ich das wissen. Ich fürchte nämlich, dieser Irrglaube wurde von den Reklamefritzen bewußt in die Welt gesetzt, um den Absatz von 64-Bit-Hard- und Software anzukurbeln. Dabei gibt es bei den herkömmlichen PCs ganz andere "Nadelöhre", an die man sich aber um der heiligen Kompatibilität willen nicht herantraut ...

Vielleicht erinnerst du dich noch: Ich hatte mal vor einiger Zeit einen Test gemacht mit Delphi XE2, und zwar ging es da um das Ausführen von Locate-Befehlen und setzen von IndexFieldNames beim Start einer Anwendung. Da waren die 64-Bit-Kompilationen größtenteils schneller als die 32-bittigen (Angaben im ms):

Testreihe mit Sortierung und Lokalisierung beim Start

*** Debug 32 IDE **********
DatMod.Verbinden_Tabellen 50
Set_Einstellungen 27790

*** Release 32 IDE **********
DatMod.Verbinden_Tabellen 48
Set_Einstellungen 27967

*** Debug 64 IDE **********
DatMod.Verbinden_Tabellen 47
Set_Einstellungen 24026

*** Release 64 IDE **********
DatMod.Verbinden_Tabellen 47
Set_Einstellungen 24489

*** Debug 32 EXE **********
DatMod.Verbinden_Tabellen 46
Set_Einstellungen 23111

*** Release 32 EXE **********
DatMod.Verbinden_Tabellen 49
Set_Einstellungen 22823

*** Debug 64 EXE **********
DatMod.Verbinden_Tabellen 46
Set_Einstellungen 19745

*** Release 64 EXE **********
DatMod.Verbinden_Tabellen 45
Set_Einstellungen 20034

Getestet wurde die Zeit, die zum Verbinden mehrerer Tabellen benötigt wird (MyQuery.Open), wenn IndexFieldNames einen Wert hat und im select ein Order-Befehl steht. Wieso das bei den 64-Bit-Versionen schneller war, weiß ich nicht. Fließkommaberechnungen finden dabei ja wohl kaum statt. Oder etwa doch?

Der schöne Günther 7. Aug 2013 07:18

AW: Delphi 64 Bit langsamer als 32 Bit
 
Ich weiß nicht, was bei Datenbanklogik bei Delphi im Hintergrund abläuft und wie du die Zeit gemessen hast, aber Delphis abenteuerlicher Typ
Delphi-Quellcode:
TDateTime
ist ja ein Double :-)

Perlsau 7. Aug 2013 07:23

AW: Delphi 64 Bit langsamer als 32 Bit
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1223778)
Ich weiß nicht, was bei Datenbanklogik bei Delphi im Hintergrund abläuft und wie du die Zeit gemessen hast, aber Delphis abenteuerlicher Typ
Delphi-Quellcode:
TDateTime
ist ja ein Double :-)

Das wissen wohl nur die Entwickler bei Emba ... :evil:

Wie kommst du jetzt auf TDateTime? Bei den Tabellen, die ich damals getestet hatte, kommt kein TDateTime vor, wie ich gerade noch einmal überprüft habe. Das sind alles Integer- und VarChar-Felder.

Der schöne Günther 7. Aug 2013 07:25

AW: Delphi 64 Bit langsamer als 32 Bit
 
Ich habe mit DBs Null Erfahrung, ich weiß ja nicht, was tatsächlich zwischen Client und Server kommuniziert wird, Zeitstempel für Transaktionen und so. Vielleicht ist es auch einfach noch zu früh am Morgen. :drunken:

Sir Rufo 7. Aug 2013 07:27

AW: Delphi 64 Bit langsamer als 32 Bit
 
Zitat:

Zitat von Perlsau (Beitrag 1223772)
Zitat:

Zitat von Sir Rufo (Beitrag 1223726)
Delphi-Referenz durchsuchenSystem.Integer ist immer 32bit (x32,x64)
Was du meinst/suchst ist Delphi-Referenz durchsuchenSystem.NativeInt

Kann man das so interpretieren, daß eine 64-Bit-Anwendung, wenn man int64 statt Integer einsetzt, schneller wird?

Das war hier nicht Kern der Aussage. Der TE hat
Delphi-Quellcode:
Integer
verwendet, weil er glaubte, dadurch je nach Platform einen 32bit bzw. 64bit Integer zu haben.

Patito 7. Aug 2013 07:27

AW: Delphi 64 Bit langsamer als 32 Bit
 
Zitat:

Zitat von jaenicke (Beitrag 1223774)
Schneller ist man bei 64-Bit, wenn es um viele Fließkommaoperationen geht. Solche Berechnungen sind durch die Multimedia-Befehle der CPU deutlich schneller.

Naja, ob es wirklich daran liegt? Zitat aus dem Embarcadero Wiki:
"In Win64, the precision of floating-point computations was reduced from extended (10-byte values) to double (8-byte values)."

Robotiker 7. Aug 2013 07:32

AW: Delphi 64 Bit langsamer als 32 Bit
 
Hallo,

Zitat:

Zitat von BigAl (Beitrag 1223717)
Als 32-Bit benötigt der Diskretisierungsvorgang ca. 24,58 Sekunden. Als 64-Bit Anwendung werden ca. 28,21 Sekunden benötigt (absolut reproduzierbar). Das klingt jetzt nicht nach viel, aber die Objekte werden später wesentlich komplexer und umfangreicher, was die benötigte Zeit vervielfacht...

Bei Berechnungen dieser Größe kann man nur wirklich was herausholen, wenn man sie auf mehrere Kerne verteilt. Um das automatisch zu machen, hat der Delphi Compiler nicht wirklich viel zu bieten.

Beim Intel C++ Compiler und bei VC++ gibt es Autovektorisierung und -parallelisierung.
http://en.wikipedia.org/wiki/Automat...ion#Techniques
http://msdn.microsoft.com/de-de/library/hh872235.aspx

Dann gibt es noch entsprechende Bibliotheken, bei Intel die Threading Collections und TBB, bei MS die PPL. Hier ein lesenswertes EBook dazu:
http://msdn.microsoft.com/en-us/library/gg675934.aspx

Das skaliert, auch wegen des Caches, nicht mit der Anzahl der Kerne, aber z.B. ein Faktor 3-4 bei einem 8-Kern-Prozessor gegenüber einer Single-Thread-Lösung sind üblich.

Was auch noch helfen kann, wäre Profile Guided Optimization, das haben diverse C++ Compiler.
http://blogs.msdn.com/b/vcblog/archi...ation-pgo.aspx

Sir Rufo 7. Aug 2013 07:34

AW: Delphi 64 Bit langsamer als 32 Bit
 
Zitat:

Zitat von Patito (Beitrag 1223782)
Zitat:

Zitat von jaenicke (Beitrag 1223774)
Schneller ist man bei 64-Bit, wenn es um viele Fließkommaoperationen geht. Solche Berechnungen sind durch die Multimedia-Befehle der CPU deutlich schneller.

Naja, ob es wirklich daran liegt? Zitat aus dem Embarcadero Wiki:
"In Win64, the precision of floating-point computations was reduced from extended (10-byte values) to double (8-byte values)."

Weil unter x32 wird die FPU (80bit = 10Byte) benutzt und unter x64 die CPU (halt 64bit = 8Byte)

BigAl 7. Aug 2013 07:37

AW: Delphi 64 Bit langsamer als 32 Bit
 
Hallo zusammen,

vielen Dank für die vielen großteils sehr informativen Antworten. Sehr interessant fand ich die Aussage von Jaenicke:

Zitat:

Dass 64-Bit oft langsamer ist, ist aber nicht nur bei Delphi so, das sieht man auch bei Java oder C++ z.B., aber der Irrglaube, dass man unbedingt 64-Bit braucht und da alles besser ist, hält sich leider (auch bei manchen hier im Forum) hartnäckig. In der Realität ist es für den Großteil der Projekte aber eher ein Nachteil.
Das ist nämlich der Punkt. Alles schreit nach 64 bit. Das mag zwar in manchen Situationen von Vorteil sein, ist (und war) aber meiner Meinung nach in den meisten Fällen nicht erforderlich. Natürlich gibt es Situationen in denen es absolut was bringt.

Das ganze beobachte ich aber schon seit dem Zeitpunkt wo alle geschrien haben, dass Delphi tot sei und es nie einen 64 Bit Delphi Compiler geben würde. Ab da wurde leider für mich auch mit Delphi alles etwas schlechter (Delphi ist aber für mich immer noch die beste Alternative). Dann kam der ganze (sorry) Quatsch mit iOS usw. Lieber als 64 Bit, iOS usw. wäre mir eine stabilere Umgebung (speziell Refactor und Co) gewesen. Ich beobachte schon lange wie Delphi sich wandelt. Ständig soll man Updates kaufen in denen noch die Fehler der Vorversionen enthalten sind aber Unmengen an Funktion (die ich leider nicht brauche) hinzugekommen sind. Aber ich schweife ab...

Nochmals vielen Dank :dance: für eure aufschlussreichen Antworten und einen schönen Arbeitstag.

Alex :-D

jobo 7. Aug 2013 07:38

AW: Delphi 64 Bit langsamer als 32 Bit
 
Zitat:

Zitat von BigAl (Beitrag 1223717)
Hat irgendjemand eine Idee, warum die 64 Bit Anwendungen langsamer sind als die 32 Bit Anwendungen?

Auch wenn es um ein sehr spezifisches Problem (Routine/Integer) geht, ich wunder mich etwas über die Diskussion.
Ich selbst bin nie in die Verlegenheit gekommen, an der Stelle um Millisekunden kämpfen zu müssen, aber ich dachte, es sei allgemein bekannt, dass 64 bit Compiler bei weitem nicht so ausgereift sind, wie 32-bit compiler.
Konkret habe ich da Aussagen zu IE64 versus 32 von MS himself im Kopf. Sie geben nicht nur unumwunden zu, dass die 64bit Version langsamer ist, sie sagen gleich dazu, dass es keine Tuning Maßnahmen geben wird.
Eine Quelle dazu kenne ich leider nicht.

Unabhängig vom Optimierungsgrad des Compilers:
Theoretisch kann ein System, das größere Datenmengen (hier größere Zahlen) in einem Befehl verarbeiten kann, diesen Vorteil erst ausspielen, wenn tatsächlich Zahlen verarbeitet werden, die größer sind, als das Vergleichsystem in "einer Operation" beherrscht. Das kleinere System müsste diese Ops ja in mehrere Schritte splitten.
Das Float-Beispiel von Jaenicke passt da ganz gut ins Bild.

Für Performancevergleiche im Bereich CPU finde ich nebenbei gesagt noch die Tests mittels Datenbank realtiv unglücklich. Eine DB ist mit dem Festplattenzugriff um Faktoren langsamer als die CPU. Sortieroperation drehen sich da bspw. eigentlich nur um die Frage, ob sie klein genug fürs RAM sind oder auf der Festplatte vorgenommen werden müssen. Erst wenn man auf der gesamten Strecke von der Festplattenblockgröße, über Treiber bis in die DB Zugriffsroutinen optimierten 64 bit Code hat, kann man sich vermutlich wirklich über ein 64bit (Datenbank-)System freuen.

Eine naheliegende Optimierung hat Robotiker ja gerade genannt. Ich glaube Intel treibt da einen relativ großen Aufwand, um seine Mehrkern Optimierungen "an den Mann" zu bringen.

Robotiker 7. Aug 2013 07:45

AW: Delphi 64 Bit langsamer als 32 Bit
 
Zitat:

Zitat von jobo (Beitrag 1223788)
Konkret habe ich da Aussagen zu IE64 versus 32 von MS himself im Kopf. Sie geben nicht nur unumwunden zu, dass die 64bit Version langsamer ist, sie sagen gleich dazu, dass es keine Tuning Maßnahmen geben wird.
Eine Quelle dazu kenne ich leider nicht.

Na, dann fangen wir mal mit dieser an, gleich noch mit einem Vergleich zu C#
http://www.codeproject.com/Articles/...-Csharp-vs-NET
Die 32- und 64-Bit VC++ Compiler nehmen sich nicht viel bei der Optimierung.

jobo 7. Aug 2013 08:27

AW: Delphi 64 Bit langsamer als 32 Bit
 
Zitat:

Zitat von Robotiker (Beitrag 1223790)
Na, dann fangen wir mal mit dieser an, gleich noch mit einem Vergleich zu C#
Die 32- und 64-Bit VC++ Compiler nehmen sich nicht viel bei der Optimierung.

Interessant! Ich hab's erstmal überflogen. Vielleicht vertiefe ich mein Halbwissen bald noch weiter :)

1. Wie weit sind solche number crunching Geschichten übertragbar auf ein "komplexes" Programm (IE, usw), meinetwegen eingeschränkt auf CPU/Grafik?
2. Berücksichtigen solche Tests eine potentiell höhere "Payload" eines 64 bit Systems?
3. Die Testergebnisse überraschen mich auf den ersten Blick nicht so sehr.

2 kleine Beispiele
Nehme ich einen 4 bit microcontroller und lasse in im Zahlenraum 1 bis 16 addieren ist er mit Sicherheit genauso schnell wie ein "baugleicher" 8 bit microcontroller mit der gleichen Aufgabe. Compileroptimierung ist hier nicht möglich.
Nehme ich einen herkömmlichen Großraum LKW und einen neuen Mega Trailer (oder wie die heißen), packe sie mit der gleichen Menge Styroporblöcken voll, werden sie auf gleicher Strecke, mit gleicher Ladung die gleiche Zeit benötigen und damit die gleiche Leistung bringen. Der große LKW war im Test dann allerdings nur halbvoll.

Die verlinkten Tests sind sicher recht nahe an der spezifischen Situation des TE, andererseits wird hier im Thread allgemein von 64bit Compilern geschrieben. Äpfel und Birnen..?

mkinzler 7. Aug 2013 08:42

AW: Delphi 64 Bit langsamer als 32 Bit
 
AMD64 aka IA32_64 aka EMT unterscheiden sich von IA32 aber um mehr als die Breite des Buses der Register.
Unter 64Bit gibt es (wie schon kurz erwähnt) keine FPU mehr, es gibt "nur" noch die Entsprechenden Vektorerweiterungen ( SSE, AVX, ...), die aber grundsätzlich mächtiger sind; es kann aber u.U. Optimierung des Codes notwendig sein.
Zudem ist der 64Bit Delphi-Compiler eine Neuentwicklung (basiert nicht auf dem 32-Bit-Compiler), was bei VC nicht so sein wird. Zudem belegen 64-Bit Programme mehr Speichern. Beim Kopieren von Speicherbereichen muss u.U. auch mehr kopiert werden. Es wird eine andere RTL, VCL und andere Funktionen der Windows-API verwendet.

Robotiker 7. Aug 2013 08:58

AW: Delphi 64 Bit langsamer als 32 Bit
 
[QUOTE=jobo;1223793]
Zitat:

Zitat von Robotiker (Beitrag 1223790)
1. Wie weit sind solche number crunching Geschichten übertragbar auf ein "komplexes" Programm (IE, usw), meinetwegen eingeschränkt auf CPU/Grafik?

Das ist wirklich schwer zu sagen, "komplexe Programme" sind alle sehr unterschiedlich.

Vielleicht mal ein konkretes Beispiel
http://www.innovmetric.com/polyworks...d.aspx?lang=en
Das ist in VC++ geschrieben, es gibt eine 32- und 64-Bit Version. Man braucht die 64-Bit Version schon, wegen der großen Datenmenge, deshalb verwendet man selten auf Rechnern mit 64-Bit Betriebssystem noch die 32-Bit Variante. Ob die dann noch etwas schneller wäre, müsste man mal testen, gefühlt ist sie es nicht.


Ansonsten kann ich von einigen eigenen Libs berichten, die sich mit dem C++ Builder, VC++ und Intel C++ übersetzen lassen, alles 32 Bit.

Derselbe Code mit VC++ oder Intel übersetzt ist schon mal deutlich (30 - 70 %) schneller, als mit dem zugegeben uralten 32-Bit Borland Compiler (in XE2, was neueres habe ich nicht).

Bei wirklich numeriklastigen Sachen ist Intel schneller als MS, aber bei anderen Dingen können kann auch MS vorne liegen oder beide gleichauf. Da der Intel Compiler unter Windows quasi ein Zusatzpaket zu Visual Studio ist, lohnt er sich meist nur, wenn man einen "Nachbrenner" braucht, wenn VC++ nicht mehr hergibt. Das ist bei uns aber eher selten der Fall.

mentaltec 7. Aug 2013 09:50

AW: Delphi 64 Bit langsamer als 32 Bit
 
Hi,

gibt es dafür

Zitat:

Zitat von mkinzler (Beitrag 1223797)
Unter 64Bit gibt es (wie schon kurz erwähnt) keine FPU mehr

einen Beleg?
ich persönlich glaube :: wer ein A20 Gate bis zur 48 bit Adressierung durchschleppt, kappt keine noch so crazy FPU.

evtl. ist es ja nur eine Empfehlung für zukünftige Entwicklungen

mfg

jfheins 7. Aug 2013 09:58

AW: Delphi 64 Bit langsamer als 32 Bit
 
Was hier auch noch nicht gesagt wurde: x64 hat mehr Register. Das kann bei manchen Sachen schon etwas ausmachen, wenn die innerste Schleife komplett in den registern läuft und keinen Cache mehr benötigt.

Hier gab' es auch mal eine interessante Begebnheit: http://stackoverflow.com/questions/17328641 . Hier wurde durch eine kleine Änderung am Code eine zusätzliche Variable alloziert. Im x64 war das zwar unnötig langsam, passte aber alles in die Register. Beim x86 wurde dafür ein Cache Zugriff nötig. In diesem Beispiel war also x64 immer schneller als x86.

Was den x87 angeht: Im 64-bit Modus ist die x87 FPU zwar nicht mehr verfügbar - aber dafür gibt es ja seit geraumer Zeit die SSE Befehle & Co
(Zumindest "hört" man das überall so. Eine genauer Quelle habe ich dafür nicht, und auch keine Lust mich durch die x64 spec zu lesen...)

Union 7. Aug 2013 10:25

AW: Delphi 64 Bit langsamer als 32 Bit
 
Viel schlimmer ist, dass man hier Äpfel mit Birnen vergleicht. Es wird unter 64 bit von Delphi nicht nur anderer Maschinen-Code durch einen zusätzlichen Compiler erzeugt, sondern auch die Funktionalität des zugrundeliegenden Source ist durch $ifdef teils eine ganz andere. Wenn man also einen echten Vergleich machen möchte, darf man nur Aufrufe machen, die sich zwischen 32 und 64 Bit vom Source nicht so stark unterscheiden.

MEissing 7. Aug 2013 11:22

AW: Delphi 64 Bit langsamer als 32 Bit
 
Noch ein Hinweis (unabhängig vom oben dargestellten Problem):
Arbeitet man mit SINGLE Werten und 64-Bit, so werden bei Berechnungen dieser SINGLE Werte die Daten vorher in ein DOUBLE kopiert und anschliessend wieder in ein SINGLE (um genauere Zwischenergebnisse zu bekommen).

Das kann uU schon mal etwas dauern... und unerwünscht sein :-)

Man kann das Verhalten des 64-Bit Compilers aber steuern:
http://docwiki.embarcadero.com/RADSt...elphi_für_x64)

Dadurch bekommt man durchaus mit 64 Bit schnelleren Code, als zB mit 32 Bit (bei rechenintensiven Anwendungen)
Siehe zB hier:
http://delphitools.info/2011/09/05/x...isappointment/
Anschaulich mit Apfelmännchen:
http://delphitools.info/2011/03/24/k...cemonkey-team/

(Der 64 Bit Compiler nutzt SSE2)

Patito 7. Aug 2013 11:26

AW: Delphi 64 Bit langsamer als 32 Bit
 
Zitat:

Zitat von mentaltec (Beitrag 1223829)
gibt es dafür
Zitat:

Zitat von mkinzler (Beitrag 1223797)
Unter 64Bit gibt es (wie schon kurz erwähnt) keine FPU mehr

einen Beleg?
ich persönlich glaube :: wer ein A20 Gate bis zur 48 bit Adressierung durchschleppt, kappt keine noch so crazy FPU.

evtl. ist es ja nur eine Empfehlung für zukünftige Entwicklungen

mfg

Also in der Hardware ist es wohl noch drin. Die Unterstützung von Microsoft aus
war wohl ein wenig am wackeln.

http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

"In 64-bit versions of Windows, the operating system preserves the MMX/x87 registers across thread (and process) switches. However, there is no explicit calling convention for the MMX/x87 registers. Code that is produced by the 64-bit compiler for x64 processors does not use these registers and does not preserve them across function calls."

Technisch könnte der Delphi-Compiler vermutlich weiter die alte FPU-Präzision behalten.

Ich interpretiere dieses "does not preserve them across function calls." jetzt mal so,
dass die Gefahr besteht, dass ein Aufruf einer Microsoft C++ dll eventuell den FPU-Status zerschießt.

OlafSt 7. Aug 2013 11:54

AW: Delphi 64 Bit langsamer als 32 Bit
 
Nicht ganz ;) "does not use" sagt aus, dsa keine MMX/x87-Register benutzt werden. Daher ist es reine Zeitverschwendung, die MMX/x87-Register zu sichern, ergo "does not preserve". Die FPU-Register bleiben also völlig unangetastet.

Patito 7. Aug 2013 12:17

AW: Delphi 64 Bit langsamer als 32 Bit
 
Zitat:

Zitat von OlafSt (Beitrag 1223849)
Nicht ganz ;) "does not use" sagt aus, dsa keine MMX/x87-Register benutzt werden. Daher ist es reine Zeitverschwendung, die MMX/x87-Register zu sichern, ergo "does not preserve". Die FPU-Register bleiben also völlig unangetastet.

Verlassen würde ich mich nicht darauf. Nur weil sie die Register nicht benutzen, heisst das noch lange nicht, dass sie nicht eben mal kurz irgendwas platt machen. Sei es auch nur Exceptions aussschalten oder die Präzision umstellen - (ist ja nur FPU-State und kein Register).

OlafSt 7. Aug 2013 12:19

AW: Delphi 64 Bit langsamer als 32 Bit
 
Wäre dem so, dann würde da auch nicht stehen "does not use".

Irgendwann muß man anfangen, sich auf die Dokumentation zu verlassen - ansonsten fangen wir irgendwann an, unser eigenes BIOS zu schreiben ;)

Patito 7. Aug 2013 13:43

AW: Delphi 64 Bit langsamer als 32 Bit
 
Hm. An ein eigenes BIOS habe ich noch nicht gedacht... :-)

Soweit ich das jetzt verstanden habe:
Technisch geht x87 unter 64bit - Microsofts wollte es zwar nicht, aber es funktioniert trotzdem.

Hier schreibt Microsoft aber, dass x87 deprecated ist
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Unter 64-bit XP gab es wohl schon Probleme
http://support.microsoft.com/kb/934198

jfheins 7. Aug 2013 14:09

AW: Delphi 64 Bit langsamer als 32 Bit
 
Ja, ich denke so kann man es ausdrücken. Da SSE aber auch schneller ist, erzeugen alle Compiler SSE Code. Und in Delphi kannst du auch kein Assembler benutzen - x87 Code und x64 Code zu mischen verlangt also entsprechend viel Handarbeit ;-)

Amateurprofi 7. Aug 2013 14:13

AW: Delphi 64 Bit langsamer als 32 Bit
 
Zitat:

Zitat von mkinzler (Beitrag 1223797)
AMD64 aka IA32_64 aka EMT unterscheiden sich von IA32 aber um mehr als die Breite des Buses der Register.
Unter 64Bit gibt es (wie schon kurz erwähnt) keine FPU mehr, es gibt "nur" noch die Entsprechenden Vektorerweiterungen ( SSE, AVX, ...), die aber grundsätzlich mächtiger sind; es kann aber u.U. Optimierung des Codes notwendig sein.
Zudem ist der 64Bit Delphi-Compiler eine Neuentwicklung (basiert nicht auf dem 32-Bit-Compiler), was bei VC nicht so sein wird. Zudem belegen 64-Bit Programme mehr Speichern. Beim Kopieren von Speicherbereichen muss u.U. auch mehr kopiert werden. Es wird eine andere RTL, VCL und andere Funktionen der Windows-API verwendet.

Na klar gibt es die noch!
Sie wird nur von Delphi nicht mehr benutzt.
Man kann sie aber mit ASM-Prozeduren weiterhin nutzen.

jaenicke 7. Aug 2013 14:23

AW: Delphi 64 Bit langsamer als 32 Bit
 
Zitat:

Zitat von jfheins (Beitrag 1223869)
Und in Delphi kannst du auch kein Assembler benutzen - x87 Code und x64 Code zu mischen verlangt also entsprechend viel Handarbeit ;-)

Assembler kannst du in Delphi durchaus auch unter 64-Bit nutzen, nur du musst die ganze Methode in Assembler schreiben und kannst nicht wie unter 32-Bit Assemblerzeilen einstreuen.

Patito 7. Aug 2013 14:30

AW: Delphi 64 Bit langsamer als 32 Bit
 
Zitat:

Zitat von jaenicke (Beitrag 1223872)
Assembler kannst du in Delphi durchaus auch unter 64-Bit nutzen, nur du musst die ganze Methode in Assembler schreiben und kannst nicht wie unter 32-Bit Assemblerzeilen einstreuen.

Und wie immer, gibt es schon jemanden, der das alles schon mal gemacht hat:

http://blog.synopse.info/post/2011/0...phi-XE2-64-bit

Patito 7. Aug 2013 14:34

AW: Delphi 64 Bit langsamer als 32 Bit
 
Zitat:

Zitat von jfheins (Beitrag 1223869)
Ja, ich denke so kann man es ausdrücken. Da SSE aber auch schneller ist, erzeugen alle Compiler SSE Code.

Da die Präzision von SSE geringer ist, ist der Geschwindigkeitsgewinn wohl leider nur ein Fake.

mkinzler 7. Aug 2013 14:44

AW: Delphi 64 Bit langsamer als 32 Bit
 
Das mag für die aktuellen Prozessoren gelten, aber ich würde mich nicht darauf verlassen

Zitat:

Zitat von http://support.amd.com/us/Processor_TechDocs/26569_APM_v5.pdf
The x87 instructions can be used in legacy mode or
long mode. Their use in long mode is available if
the following feature bit is set:


Long Mode, as indicated by CPUID Fn8000_0001_EDX[LM] = 1.



Alle Zeitangaben in WEZ +1. Es ist jetzt 10:36 Uhr.
Seite 1 von 2  1 2      

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