Ich benutze immer gerne die Variable mit der kleinsten Größe, die gut funktioniert, Aber würde dies wirklich gewinnen, wenn ich kurze Byte-Ganzzahlen anstelle von Ganzzahl verwendet, und der Speicher ist 32-Bit-Wort adressierbar, tut der Compiler etwas zu verbessern Speichernutzung ?Warum ganze Zahlen kleiner als 32bit verwenden?
Antwort
Für lokale Variablen ist es wahrscheinlich nicht so sinnvoll, aber mit kleineren ganzen Zahlen in Strukturen, in denen Sie Tausende oder sogar Millionen von Elementen haben, können Sie eine beträchtliche Menge an Speicher sparen.
Nein, wurde int
gewählt der schnellste int-Typ für mopdern 32/64 Bit-Architekturen sein, kürzer mit (short
, sbyte
) Arten werden Sie nur die Leistung kosten.
Sie können manchmal Speicher sparen, aber nur bei Verwendung großer Arrays oder Listen. Und selbst dann zahlt es sich normalerweise nicht aus.
Berechnung mit 8 Bits:
sbyte a, b, c;
a = (sbyte) (b + c);
Die Typumwandlung erforderlich ist, und trägt eine Laufzeitkosten.
Jeder Kommentar mit dem Down-Vote? –
Aber wir laufen nicht (direkt) auf x86. C# erweitert Bytes und Kurzschlüsse für jede Berechnung. –
BTW, ich habe dich nicht enttäuscht oder abgelehnt ... Ich möchte nur kommentieren ... aber meine Vermutung auf dem Downvote ist, dass deine Antwort nicht ganz korrekt auf den Performance-Behauptungen war. Außerdem können Sie viel Speicher in Strukturen speichern, die nicht nur in Arrays oder Listen enthalten sind. Wir arbeiten zum Beispiel an Spielen mit großen 3D-Welten mit buchstäblich zehn- oder hunderttausenden Objekten, die lose in einem gerichteten Graphen miteinander verbunden sind (eines unserer Spiele lädt etwa 200.000 Objekte).Variable Größen sind für Leistung und Speicher wichtig. – Adisak
Wenn es sich um eine einfache Variable handelt, wird durch die Verwendung einer kürzeren Breite nichts gewonnen und es kann zu Leistungseinbußen kommen. Der Compiler erweitert den Speicher automatisch auf ein vollständiges Prozessorwort. Selbst wenn Sie also nur 16 Bit deklarieren, werden wahrscheinlich 32 Bit auf dem Stack benötigt. Außerdem muss der Compiler in einigen Fällen bestimmte Abschneideoperationen durchführen (z. B. wenn das Feld Teil einer Struktur ist); Diese können einen geringen Overhead verursachen.
Es ist wirklich nur wichtig für Strukturen und Arrays, d. H. Wenn Sie viele Werte haben. Für eine Struktur können Sie etwas Speicher sparen, auf Kosten des Overheads, den ich oben erwähne. Außerdem müssen Sie möglicherweise eine kleinere Größe verwenden, wenn die Struktur einem externen Layout folgen muss. Bei einem Array können Speichereinsparungen relevant sein, wenn das Array groß ist.
Normalerweise bleiben bei int
usw.
Zusätzlich zu den anderen Antworten; Es gibt auch Fälle, in denen Sie absichtlich nur die angegebene Datengröße unterstützen möchten, da dies eine Schlüsselwahrheit über die Daten darstellt. Dies kann der Schlüssel sein, wenn Sie mit externen Systemen (insbesondere Interop, aber auch Datenbanken, Dateiformaten usw.) sprechen und möglicherweise mit checked
Arithmetik gemischt werden - um Überläufe so früh wie möglich zu überdecken.
Um ehrlich zu sein, ist der Speicherverbrauch wahrscheinlich nicht der zwingendste Grund, kleine Ints zu verwenden (in diesem Beispiel). Aber es steht ein allgemeines Prinzip auf dem Spiel, das besagt, dass Sie nur den Speicher verwenden sollten, der für Ihre Datenstrukturen erforderlich ist.
Das Prinzip ist dies, nur die Breite, die Ihre Daten erfordern zuweisen und lassen Sie den Compiler finden Sie alle Überlauf Fehler, die auftreten können, ist eine zusätzliche Debugging-Technik, die sehr effektiv ist. Wenn Sie wissen,, dass ein Wert nie einen Schwellenwert überschreiten sollte dann nur bis zu diesem Schwellenwert zuweisen.
- 1. Warum ist Integer.MAX_VALUE + 1 kleiner als Integer.MAX_VALUE?
- 2. Wie erhalten Sie number_format(), um zwei Dezimalstellen für ganze Zahlen kleiner als 10 hinzuzufügen?
- 3. Sind Zeiger als ganze Zahlen gespeichert?
- 4. Wie verkette ich ganze Zahlen als String?
- 5. floating und ganze Zahlen ....?
- 6. Begünstigt SHA256 ganze Zahlen?
- 7. AS3 Dividieren ganze Zahlen
- 8. nicht negative ganze Zahlen
- 9. kommagetrennte String ganze Zahlen
- 10. Javascript Summieren große ganze Zahlen
- 11. Ermitteln gerade/ungerade Zahlen (ganze Zahlen)?
- 12. Sind Java "Zeiger" ganze Zahlen?
- 13. Für Schleife. Warum ist es kleiner als <nicht kleiner als oder gleich <=?
- 14. Java ArrayList für ganze Zahlen
- 15. Wie kann System.out.printIn() ganze Zahlen akzeptieren?
- 16. Soll ich Telefonnummern als Zeichenfolgen oder ganze Zahlen speichern?
- 17. Javascript berechnet Zeichenfolge von Flask als ganze Zahlen gesendet
- 18. Loading ganze Zahlen größer als 32-Bit in MIPS-Assembly
- 19. Werte aus der CSV-Datei nicht als ganze Zahlen
- 20. jQuery US-Währung Validierung REGEX ganze Zahlen als auch
- 21. Infix zu postfix lesen negative ganze Zahlen als negative
- 22. Indexdatei kleiner als
- 23. Runden Dezimalzahlen auf ganze Zahlen
- 24. Diehard test nur ganze Zahlen?
- 25. Passing ganze Zahlen mit Konstrukteuren
- 26. Große ganze Zahlen in C#
- 27. Regex: Komma getrennte ganze Zahlen
- 28. Haskell Cofrime negative ganze Zahlen?
- 29. Sollen HTML5-Canvas-Koordinaten Fließkommazahlen oder ganze Zahlen verwenden?
- 30. Ist es sicher, negative ganze Zahlen mit size_t zu verwenden?
FWIW, auf einem PC im 32-Bit-Modus können 16-Bit-Ints tatsächlich ein wenig langsamer als 32-Bit-Ints sein, da die Maschinen-Opcodes tatsächlich ein zusätzliches Byte benötigen, um anzugeben, dass sie 16-Bit-Operanden verwenden. Verwenden Sie also für lokale Variablen den nativen Int-Typ, wenn er für Sie funktioniert. Auch für Strukturen, um Speicher zu sparen, verwenden Sie, was auch immer die kleinste Größe funktioniert. Vielleicht möchten Sie Member-Variablen nach Größen gruppieren, damit Sie keinen Platz zwischen Padding-Elementen unterschiedlicher Größe verschwenden. – Adisak
BTW, hier ist ein Artikel mit dem Titel "Mastering Structs in C#", der genau beschreibt * GENAU *, was ich über die Gruppierung von Variablen ähnlicher Größe gesagt habe: http://www.vsj.co.uk/articles/display.asp?id= 501 – Adisak
Ich mochte den Link, sehr informativ und ich würde gerne wissen, Wie werde ich einen ähnlichen Gewinn mit Arrays haben, wird es so etwas wie Strukturen sein? –