![]() |
Enormer Performanceunterschied zwischen 32 und 64 Bit?
Hallo zusammen,
ich arbeite momentan an einem C++ Projekt mit Visual Studio 2013, zu dem ich leider nicht näheres sagen kann. Grob beschrieben ist es ein Parser für ein relativ komplexes Datenformat. Jetzt habe ich mir mal eine kleine Anwendung geschrieben, welche einfach nur 100MiB an Daten sequenziell dekodiert. Das Ergebnis hat mich dann doch ziemlich erstaunt (beide Kompilate als Release erstellt):
Die Dekodierung basiert größtenteils auf arithmetischen und logischen Funktionen, ein paar Lookups in einer Datentabelle, ein paar Switches und das ganze verpackt in einige Unterfunktionen. Dazu kommen noch einige "sprintf" Aufrufe (welche laut Profiler sowohl in der 32, als auch der 64 Bit Version relativ langsam sind). Ich weiß, es sind recht wenig Infos, aber kann sich jemand erklären, wie die 64 Bit Version über 90% schneller sein kann? :shock: Viele Grüße Zacherl |
AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?
Bei 64 Bit ist der virtuelle Adressraum größer und fragmentiert daher nicht so leicht. Aber ob sich das auf herkömmliche Speichermanager auch auswirkt, weiß ich nicht. Ich habe es nur vor allem bei Firefox beobachtet, dass der unter 64 Bit einfach viel besser läuft als unter 32 Bit, obwohl er netto nicht mal mehr Speicher in Anspruch nimmt. Unter 32 Bit hatte ich alle paar Sekunden Ruckler, wenn der Garbage Collector angesprungen ist, unter 64 Bit läuft alles flüssig.
Ansonsten: Keine Ahnung... Alignment vielleicht? Bessere Cache-Ausnutzung? Oder der Compiler benutzt unter 64 Bit irgendwelche Super-Spezial-Instruktionen... |
AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?
Benutze momentan ausschließlich statischen Speicher (bzw. einen Vector, welcher aber nur einmalig alloziiert wird), deshalb denke ich nicht, dass dieser enorme Boost mit geringerer Speicherfragmentierung zu erklären ist.
Spezialinstruktionen kann ich ebenfalls zu 99% ausschließen. Sah auf den ersten Blick in IDA zumindest alles recht ähnlich aus und die selben AVX Instructions, die ich bei der 64 Bit Version finden konnte, existierten meistens auch beim 32 Bit Kompilat. Hatte den Verdacht, dass es daran liegt, dass ich viele 64 bit Integer verwende (auch unter 32 Bit), aber laut Stackoverflow macht das von der Performance her keinen allzu drastischen unterschied (Addition war glaube ich 2 statt 1 Instruktion, etc). Die einzigen zwei Dinge, die mir noch in den Sinn kamen, sind:
Bloß lese ich überall, dass man bei 64 Bit Kompilaten mit ca. 2-20% Performancezuwachs rechnen kann. In meinem Fall sind es halt über 90%, weshalb ich mir irgendwie Gedanken mache unter 32 Bit auf gut Deutsch irgendwas verkackt zu haben. Der Profiler von VS2013 kann mir leider auch keinen genaueren Einblick verschaffen. Der prozentuale Anteil der einzelnen Funktionen ist bei beiden Kompilaten in etwa gleich. Der einzige Unterschied ist wirklich, dass die Ausführung der Methoden unter 32 bit signifikant länger dauert. |
AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?
Zitat:
Edit: Du könntest ja mal valgrind drauf loslassen. Soweit ich weiß kann man sich da auch Statistiken zur CPU-Cache-Effizienz und ähnlichem Low-Level-Kram ausgeben lassen. |
AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?
Eine 32-Bit-CPU/FPU, bzw. der 32-Bit Teil einer CPU, für die 32-Bit-Programme, kann natürlich nur mit 32-Bit-Integern rechnen.
Bei Fließkommazahlen bis 64/80 Bit. Wenn ihr mal in die CPU-Ansicht schauen würdet, dann hättet ihr bemerkt, daß 64-Bit-Integeroperationen in Win32 nur "emuliert" werden, indem die Rechenoperationen auf zwei 32-Bit-Integer aufgeteilt werden, was natürlich nicht wirklich schnell sein kann. PS: schaut mal in die System.pas und haltet ausschau nach
Delphi-Quellcode:
Das sint praktisch die Funktionen, welche Delphi/C++ intern benutzt, wenn man *, div, mod, shl usw. auf Int64 oder UInt64 anwendet. :stupid:
{ 64-bit Integer helper routines }
{$IF defined(CPU386)} procedure __llmul; procedure __lldiv; procedure __lludiv; procedure __llmod; procedure __llmulo; procedure __lldivo; procedure __llmodo; procedure __llumod; procedure __llshl; procedure __llushr; {$ENDIF} Ja, via SSE/MMX gibt es auch in Win32 ein paar 64- und 128-Bit-Register, aber diese sind ja nicht für einen Wert vorgesehn, sondern stellen eine Technik zur Stream-/Parallelverarbeitung mehrerer gleichartiger Berechnungen dar. |
AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?
Zitat:
Zitat:
Da die Verteilung im Profiler doch ziemlich gleich aussieht, ist der für mich plausibelste Grund momentan die Existenz der 8 zusätzlichen GP-Register und die langsamere Callingconvention. |
AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?
Hast das mal eingegrenzt?
Sind es die Switches? Die Lookups? Die Unterfunktionen? Wäre doch ein Leichtes, ein paar Tests zu machen. |
AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?
Hat irgendjemand schonmal in betracht gezogen, dass auf einem 64-Bit Windows 32-Bit Anwendungen mittels
![]() Zitat:
Also werden die Befehle in SOFTWARE verarbeitet und nicht vom Prozessor direkt ausgeführt. Ich denke, das ist der Hauptgrund, warum das ganze so langsam ist. Wohl gemerkt solltest du dein Programm mal auf einem echten 32-Bit windows testen... vermutlich läuft es dort deutlich schneller. |
AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?
Das gilt für IA64 und nicht für X32_64. Dort läuft auch alles nativ auf dem Prozessor
|
AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?
Zitat:
|
AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?
Zitat:
|
AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?
Zitat:
|
AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?
[DerBlindeÜberFarben-Modus]
Hieß es nicht mal, dass C++ für 64bit einen völlig neuen Compiler bekommen sollte (LLVM)? Ich hätte zwar gedacht, das würde (weil es eine Zwischenschicht ähnlich .net wäre langsamer... Hat es vielleicht damit was zu tun? Ansonsten vielleicht einfach mal MEissing anfragen. Sowas beantwortet er ja i.d.R. schon. [/DerBlindeÜberFarben-Modus] |
AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?
Visual C++ wird wohl eher kein LLVM verwenden, C++-Builder schon.
|
AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?
Stimmt. Brille ist geputzt. :)
|
AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?
Zitat:
Diese "Zwischenschicht" ist eher eine Architektur mit der der Compiler einfacher, modularer und einfacher Optimierbarer entwickelt werden kann. Der (vermutlich fast nahezu nicht mehr erweiterbare) 32-Bit Compiler von Delphi wäre das gegenstück zu einem auf LLVM aufsetzenden Compiler. |
AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?
Zitat:
Der einzige Unterschied ist, dass das 32 Bit Kompilat eine durchweg deutlich langsamere absolute Laufzeit hat (das gillt auch für externe Runtime Funktionen wie z.b. "sprintf"). Es gibt auch keine Funktion, welche allein betrachtet herraussticht (alle lowest-level Methoden beanspruchen höchstens mal 4% der Gesamtlaufzeit). Zitat:
Was den Compiler angeht: Ich verwende wie gesagt Visual Studio 2013, dementsprechend wird mit MSVC12 kompiliert (das Ding ist dem Delphi Compiler was Performance und Optimierung angeht um Jahrzehnte vorraus). Beide Versionen meines Programms habe ich aber als Release kompiliert, von daher werden beide Kompilate auch maximal optimiert. In IDA (Disassembler) konnte ich zudem einen, beim kurzen überfliegen, fast identischen Aufbau der Programme auf Assembler-Ebene feststellen. Vielleicht bin ich ja Opfer eines Bootkits geworden, dass alle meine 32 Bit Anwendungen Softwareseitig emuliert :stupid: :mrgreen: (ne Spaß bei Seite; das Problem tritt auch auf einem zweiten PC mit Intel Prozessor auf) |
AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?
Zitat:
100000x Datenlookup durchlaufen lassen. 100000x Switch durchlaufen lassen. die 100000 sind natürlich nur Richtwerte. Vermutlich musst Du das millionenfach machen. 1x 64bit 1x 32bit. Da wird es doch Unterschiede geben. Pfeif mal auf den Profiler. Wenn trotzdem alles gleich ist, dann ... irrst Du dich wohl :stupid: oder die Uhren gehen anders (Relativitätstheorie und so) |
AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?
Zitat:
Sind es nicht eher 10%? Zitat:
|
AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?
Zähl mal die Nullen. ;-)
Da steht 9s und 0,8s. Gibt also rund 91%. |
AW: Enormer Performanceunterschied zwischen 32 und 64 Bit?
Von den Nullen her stimmts doch. 90 hat eine Null, 10 hat eine Null. Und eine Null ist es ja auch weniger. :stupid:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 Uhr. |
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 by Thomas Breitkreuz