Es hängt von der genauen CPU und dem Betrieb ab. Auf 64-Bit-Pentium IVs beispielsweise war die Multiplikation von 64-Bit-Registern etwas langsamer. Core 2 und neuere CPUs wurden von Grund auf für den 64-Bit-Betrieb entwickelt.
Im Allgemeinen verwendet sogar Code, der für eine 64-Bit-Plattform geschrieben wurde, 32-Bit-Variablen, wenn Werte in sie passen. Dies liegt nicht hauptsächlich daran, dass Arithmetik schneller ist (auf modernen CPUs ist dies im Allgemeinen nicht der Fall), sondern daran, dass weniger Speicher und Speicherbandbreite verwendet werden.
Eine Struktur mit einem Dutzend Ganzzahlen ist halb so groß, wenn diese Ganzzahlen 32-Bit sind, als wenn sie 64-Bit sind. Das bedeutet, dass nur halb so viele Bytes zum Speichern benötigt werden, halb so viel Platz im Cache und so weiter.
64-Bit-native Register und Arithmetik werden verwendet, wenn Werte möglicherweise nicht in 32-Bit passen. Die wichtigsten Leistungsvorteile ergeben sich jedoch aus den zusätzlichen Allzweckregistern, die im x86_64-Befehlssatz verfügbar sind. Und natürlich gibt es alle Vorteile, die 64-Bit-Zeiger mit sich bringen.
Die wirkliche Antwort ist also, dass es keine Rolle spielt. Selbst wenn Sie den x86_64-Modus verwenden, können Sie (und tun dies im Allgemeinen) immer noch 32-Bit-Arithmetik verwenden, wo dies erforderlich ist, und Sie erhalten die Vorteile größerer Zeiger und universellerer Register. Wenn Sie native 64-Bit-Operationen verwenden, liegt das daran, dass Sie 64-Bit-Operationen benötigen und wissen, dass sie schneller sind, als sie mit mehreren 32-Bit-Operationen vorzutäuschen – Ihre einzige andere Wahl. Daher sollte die relative Leistung von 32-Bit- gegenüber 64-Bit-Registern niemals ein entscheidender Faktor bei einer Implementierungsentscheidung sein.
Ich bin gerade über diese Frage gestolpert, aber ich denke, hier fehlt ein sehr wichtiger Aspekt:Wenn Sie wirklich in den Assembler-Code schauen und den Typ „int“ für Indizes verwenden, wird dies wahrscheinlich den Code verlangsamen, den Ihr Compiler generiert. Dies liegt daran, dass „int“ ist auf vielen 64-Bit-Compilern und -Plattformen (Visual Studio, GCC) standardmäßig ein 32-Bit-Typ, und Adressberechnungen mit Zeigern (die auf einem 64-Bit-Betriebssystem notwendigerweise 64-Bit sind) und „int“ führen dazu, dass der Compiler unnötige Konvertierungen zwischen 32- und 64-Bit-Registern ausgibt .Ich habe dies gerade in einer sehr leistungskritischen inneren Schleife meines Codes erlebt. Der Wechsel von 'int' zu 'long long' als Schleifenindex verbesserte die Laufzeit meines Algorithmus um etwa 10 %, was angesichts der umfangreichen SSE/AVX2-Vektorisierung, die ich zu diesem Zeitpunkt bereits verwendete, ein ziemlich großer Gewinn war.