Eine 32-Bit-CPU ist eine CPU, die normalerweise intern mit 32-Bit-Werten arbeitet. Dies bedeutet jedoch nicht, dass sie langsamer ist, wenn dieselbe Operation für einen 8/16-Bit-Wert ausgeführt wird. Zum Beispiel kann x86, das bis zum 8086 noch abwärtskompatibel ist, auf Bruchteilen eines Registers arbeiten. Das heißt, selbst wenn ein Register 32 Bit breit ist, kann es nur auf dem ersten 16 oder dem ersten 8 Bit dieses Registers arbeiten und es wird überhaupt keine Verlangsamung geben. Dieses Konzept wurde sogar von x86_64 übernommen, wo die Register 64 Bit sind, aber sie können immer noch nur mit den ersten 32, 16 oder 8 Bit arbeiten.
Auch x86-CPUs laden immer eine ganze Cache-Zeile aus dem Speicher, wenn nicht bereits im Cache, und eine Cache-Zeile ist sowieso größer als 4 Byte (für 32-Bit-CPUs eher 8 oder 16 Byte) und lädt 2 Byte aus dem Speicher ist genauso schnell wie das Laden von 4 Bytes aus dem Speicher. Wenn viele Werte aus dem Speicher verarbeitet werden, können 16-Bit-Werte tatsächlich viel schneller als 32-Bit-Werte sein, da es weniger Speicherübertragungen gibt. Wenn eine Cache-Zeile 8 Bytes groß ist, gibt es vier 16-Bit-Werte pro Cache-Zeile, aber nur zwei 32-Bit-Werte. Bei Verwendung von 16-Bit-Werten haben Sie also alle vier Werte einen Speicherzugriff , was zu doppelt so vielen Übertragungen für die Verarbeitung eines großen int-Arrays führt.
Andere CPUs, wie zum Beispiel PPC, können nicht nur einen Bruchteil eines Registers verarbeiten, sie verarbeiten immer das volle Register. Diese CPUs haben jedoch üblicherweise spezielle Ladeoperationen, die es ihnen ermöglichen, z. Laden Sie einen 16-Bit-Wert aus dem Speicher, erweitern Sie ihn auf 32 Bit und schreiben Sie ihn in ein Register.Später haben sie eine spezielle Speicheroperation, die den Wert aus dem Register übernimmt und nur die letzten 16 Bits in den Speicher zurückspeichert; Beide Operationen benötigen nur einen CPU-Zyklus, genau wie ein 32-Bit-Lade-/Speichervorgang, so dass es auch keinen Geschwindigkeitsunterschied gibt. Und da PPC nur arithmetische Operationen an Registern durchführen kann (im Gegensatz zu x86, das auch direkt im Speicher arbeiten kann), findet diese Lade-/Speicherprozedur trotzdem statt, egal ob Sie 32 Bit Inte oder 16 Bit Inte verwenden.
Der einzige Nachteil, wenn Sie mehrere Operationen auf einer 32-Bit-CPU verketten, die nur mit vollen Registern arbeiten kann, ist, dass das 32-Bit-Ergebnis der letzten Operation möglicherweise auf 16 Bit vor dem nächsten zurückgeschnitten werden muss Die Operation wird ausgeführt, andernfalls ist das Ergebnis möglicherweise nicht korrekt. Ein solcher Rückschnitt ist jedoch nur ein einzelner CPU-Zyklus (eine einfache AND-Operation), und Compiler sind sehr gut darin, herauszufinden, wann ein solcher Rückschnitt wirklich notwendig ist, und wenn er weggelassen wird, hat er keinen Einfluss auf das Endergebnis , also wird ein solcher Rückschnitt nicht nach jeder Anweisung ausgeführt, er wird nur durchgeführt, wenn es wirklich unvermeidlich ist. Einige CPUs bieten verschiedene "erweiterte" Anweisungen, die einen solchen Verzicht überflüssig machen, und ich habe viel Code in meinem Leben gesehen, wo ich eine solche Kürzung erwartet hatte, aber der Compiler hat einen Weg gefunden vermeide es vollständig.
Also, wenn Sie hier eine allgemeine Regel erwarten, muss ich Sie enttäuschen. Man kann auch nicht mit Sicherheit sagen, dass 16-Bit-Operationen für 32-Bit-Operationen gleich schnell sind, noch kann jemand mit Sicherheit sagen, dass 32-Bit-Operationen immer schneller sind. Es hängt auch davon ab, was genau dein Code mit diesen Zahlen macht und wie es das macht. Ich habe Benchmarks gesehen, bei denen 32-Bit-Operationen bei bestimmten 32-Bit-CPUs schneller waren als der gleiche Code bei 16-Bit-Operationen, aber ich habe auch schon das Gegenteil gesehen. Selbst wenn Sie von einem Compiler zu einem anderen wechseln oder Ihre Compiler-Version aktualisieren, wird möglicherweise bereits alles wieder umgestellt. Ich kann nur folgendes sagen: Wer behauptet, dass die Arbeit mit Shorts wesentlich langsamer ist als die Arbeit mit Ints, soll bitte einen Beispielquellcode für diesen Anspruch angeben und CPU und Compiler nennen, die er zum Testen verwendet hat, da ich so etwas noch nie erlebt habe über die letzten 10 Jahre. Es kann Situationen geben, in denen die Arbeit mit Ints vielleicht 1-5% schneller ist, aber nichts unter 10% ist nicht "signifikant" und die Frage ist, ob es sich lohnt, in manchen Fällen doppelt so viel Speicher zu verschwenden, nur weil es Sie kaufen kann 2% Leistung? Ich denke nicht.
Doppelte Frage. Siehe [.NET Integer vs Int16?] (Http://stackoverflow.com/questions/129023/net-integer-vs-int16#137625) (Es ist mit .Net bezeichnet, aber es gilt das gleiche wie über die Hardware-Architektur.) –
@ JonAdams: Dies ist absolut kein Duplikat in irgendeiner Weise, da .NET ein eigenes Framework ist und alles, was für .NET gilt, möglicherweise nicht für etwas anderes als .NET gilt. Auf einigen CPUs können 32-Bit-Ops in .NET schneller sein (da .NET dafür optimiert wurde), aber beim Schreiben von einfachem C-Code können 64-Bit-Ops viel schneller sein als 32-Bit-Ops auf dieser CPU (weil der C-Compiler möglicherweise in der Lage sein, den Code für 64 Bit viel besser zu optimieren als für 32 Bit). – Mecki