.NET Ganzzahl vs Int16?
Habe ich eine fragwürdige Codierung der Praxis.
Wenn ich brauche, um zu Durchlaufen und eine kleine Liste von Gegenständen, deren Anzahl zu begrenzen ist unter 32000
verwende ich Int16
für meine ich Variablen geben Sie statt Integer
. Ich mache das, weil ich davon ausgehen mit der Int16
ist effizienter als eine vollständige geblasen Integer
.
Bin ich falsch? Gibt es keine effektive performance-Unterschied zwischen einer Int16
vs Integer
? Sollte ich aufhören Int16
- und just-stick mit Integer
für alle meine zähl - /iteration braucht?
InformationsquelleAutor der Frage Matias Nino | 2008-09-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entsprechend der unten stehenden Referenz, die Laufzeit optimiert die Leistung von Int32 und empfiehlt Ihnen für Zähler und andere Häufig aufgerufene Vorgänge.
Aus dem Buch: MCTS Self-Paced Training Kit (Exam 70-536): Microsoft® .NET Framework 2.0—Application Development Foundation
Kapitel 1: "Framework-Grundlagen"
Lektion 1: "Die Verwendung Von Value Types"
Auch Tabelle 1-1 im gleichen Abschnitt listet empfohlene Verwendungen für jeden Typ.
Relevant für diese Diskussion:
InformationsquelleAutor der Antwort hurst
Sollten Sie fast immer verwenden
Int32
oderInt64
(und, Nein, Sie nicht bekommen, Kredit von überUInt32
oderUInt64
) beim Durchlaufen eines array oder einer Auflistung von index.Dem ganz offensichtlichen Grund, dass es weniger effizient ist, dass alle array-und collection-Indizes gefunden, die in der BCL nehmen
Int32
s, also einen impliziten cast ist immer passiert im code, der versucht, zu verwendenInt16
s als index.Den weniger offensichtlichen Grund (und der Grund dafür, dass arrays nehmen
Int32
als index) ist, dass der CIL-Spezifikation sagt, dass alle Betriebs-stack-Werte sind entwederInt32
oderInt64
. Jedes mal, wenn Sie entweder laden oder speichern einen Wert, um alle anderen integer-Typ (Byte
,SByte
,UInt16
,Int16
,UInt32
, oderUInt64
), es ist eine implizite Konvertierung operation beteiligt. Unsigned-Typen keine Strafe für den laden, aber für das speichern der Werte, dies entspricht einer Trunkierung und einen möglichen überlauf zu prüfen. Für die signed-Typen jeder Last-Zeichen-erstreckt, und jeder store anmelden-klappt (und hat eine mögliche overflow-check).Den Ort, das wird dich am meisten verletzen ist die Schleife selbst, nicht das array zugreift. Zum Beispiel nehmen Sie diese unschuldig aussehende Schleife:
Sieht gut aus, richtig? NÖ! Das können Sie im Grunde ignorieren Sie die Initialisierung (
short i = 0
), da es nur einmal passiert, aber der Vergleich (i<32000
) und increment (i++
) Teile passieren 32000 mal. Hier einige pesudo-code für das, was dieses Ding sieht aus wie an der Maschine Stufe:Gibt es 3 Konvertierungen gibt, die ausgeführt werden 32000 Zeiten. Und Sie hätte ganz vermieden, die nur mit einem
Int32
oderInt64
.Update: Wie ich sagte in Kommentar, ich habe jetzt in der Tat geschrieben, einen blog-post zu diesem Thema, .NETTO-Integrale Datentypen, Und Sie
InformationsquelleAutor der Antwort Alex Lyman
Int16 tatsächlich weniger effizient, weil die x86-Anweisungen für word Zugriff mehr Platz als die Anweisungen für den dword-Zugriff. Es wird davon abhängen, was der JIT hat. Aber egal was, es ist fast sicher nicht mehr effizient, wenn Sie als variable in einer iteration.
InformationsquelleAutor der Antwort Curt Hagenlocher
Das Gegenteil ist wahr.
32 (oder 64) bit-Ganzzahlen sind schneller als int16. Im Allgemeinen ist der native Datentyp ist der Schnellste.
Int16 sind schön, wenn Sie wollen, um Ihren Daten-Strukturen so schlank wie möglich. Das spart Platz und kann die Leistung verbessern.
InformationsquelleAutor der Antwort Nils Pipenbrinck
Alle performance-Unterschied wird so klein auf moderne hardware, die für alle Absichten und Zwecke, es werde keinen Unterschied machen. Schreiben Sie ein paar test-Gurte und führen Sie Sie beide ein paar hundert mal, nehmen Sie die Durchschnittliche loop Fertigstellung mal, und du wirst sehen was ich meine.
Mag es Sinn machen, von einer Aufbewahrung Perspektive, wenn Sie haben eine sehr begrenzte Ressourcen - embedded-Systeme mit einem winzigen stack, Draht-Protokolle entworfen für die langsamen Netzen (z.B. GPRS etc), und so weiter.
InformationsquelleAutor der Antwort Russ
Nie davon ausgehen Effizienz.
Was ist oder nicht mehr effizient variiert von compiler zu compiler und Plattform zu Plattform. Es sei denn, Sie tatsächlich getestet, es gibt keine Möglichkeit zu sagen, ob int16 oder int ist effizienter.
Ich würde nur stick mit int-Werten, es sei denn, Sie kommen über eine bewährte performance-problem, das mit int16 behebt.
InformationsquelleAutor der Antwort 17 of 26
Verwenden Int32 32-bit-Maschinen (oder Int64 auf 64-bit-Maschinen), für höchste Leistung. Ein kleinerer integer-Typ, wenn Sie wirklich besorgt über den Raum, den er nimmt (kann langsamer sein, obwohl).
InformationsquelleAutor der Antwort Mark Cidade
Anderen hier korrekt sind, verwenden Sie nur weniger als Int32 (32-bit-code)/Int64 (für 64-bit-code), wenn Sie es brauchen für extreme Anforderungen an die Lagerung, oder für eine andere Ebene der Durchsetzung der auf einer business-Objekt-Feld (sollten Sie noch Anwesen-level-Validierung in diesem Fall, natürlich).
Und im Allgemeinen, keine Gedanken über die Effizienz bis es ein performance-problem. Und in diesem Fall Profil. Und wenn denke & Prüfung mit beiden Möglichkeiten beim profiling hilft Ihnen nicht genug, überprüfen Sie den IL-code.
Gute Frage aber. Sie sind das lernen mehr darüber, wie der compiler funktioniert es Sache. Wenn Sie wollen Programmieren lernen effizienter, lernen Sie die Grundlagen des IL und wie die C#/VB Compiler Ihren job machen, wäre eine tolle Idee.
InformationsquelleAutor der Antwort Jon Adams
Ich kann mir nicht vorstellen, das es eine erhebliche Leistungssteigerung auf Int16 vs. int.
Sparen Sie einige bits in der Variablen-Deklaration.
Ist, und definitiv nicht der Mühe Wert, wenn sich die Spezifikationen ändern und was auch immer Sie zählen kann über 32767 jetzt, und Sie entdecken, dass Ihre Anwendung beim starten auslösen von Ausnahmen...
InformationsquelleAutor der Antwort Dana
Gibt es keine nennenswerten performance-Gewinn bei der Verwendung eines Datentyps kleiner ist als Int32, in der Tat, ich habe irgendwo gelesen, dass die Verwendung Int32 wird schneller sein als Int16, weil der memory allocation
InformationsquelleAutor der Antwort Leon Tayson