2009-10-25 18 views
5

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

11

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.

+1

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

+1

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

+0

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? –

4

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.

+0

Jeder Kommentar mit dem Down-Vote? –

+2

Aber wir laufen nicht (direkt) auf x86. C# erweitert Bytes und Kurzschlüsse für jede Berechnung. –

+0

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

3

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.

3

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.

2

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.

Verwandte Themen