2010-03-16 16 views
14

Ich bin immer noch ziemlich neu, also ertrage mich bei dieser Frage, meine Frage (n) sind nicht streitsüchtig oder kleinlich, aber während des Lesens kam mir etwas merkwürdig vor.Verschiedene numerische Variablentypen verwenden

Im unter der Annahme, dass, wenn Computer langsam waren und Speicher teuer war, die Verwendung der richtigen Variablentyp viel mehr eine Notwendigkeit als es heute ist. Jetzt, wo die Erinnerung ein bisschen leichter ist, scheinen sich die Leute etwas entspannt zu haben. Zum Beispiel sehen Sie diesen Beispielcode überall:

for (int i = 0; i < length; i++) 

int? (-2,147,483,648 bis 2,147,483,648) für die Länge? Isnt Byte (0-255) eine bessere Wahl?

Also Ich bin neugierig auf Ihre Meinung und was Sie glauben, um Best Practice zu sein, ich hasse es zu glauben, dass dies nur verwendet werden würde, weil das Akronym "Int" intuitiver für einen Anfänger ist ... oder ist Speicher gerade so billig geworden dass wir uns wirklich nicht mit solchen kleinen Dingen beschäftigen müssen und deshalb sollten wir einfach lange verwenden, damit wir sicher sein können, dass andere Zahlen/Typen (innerhalb des Grundes) automatisch verwendet werden können?

... oder bin ich nur albern, indem ich mich mit solchen Dingen beschäftige?

+3

Definitiv nicht dumm, Neugier hilft, einen besseren Programmierer zu bauen. – ChaosPandion

Antwort

10

Luca Bolognese gepostet this in seinem Blog.

Hier ist der relevante Teil:

  • Verwendung int, wenn Ihre Werte in einem int passen, auch für Werte, die nie negativ
  • Verwenden lang sein können, wenn Ihre Werte nicht in einem int passen .
  • Byte, sbyte, short, ushort, uint und ulong sollten immer nur für Interop mit C-Code verwendet werden. Sonst sind sie den Aufwand nicht wert.
2

Im Allgemeinen ist Speicher in diesen Tagen billig, da Sie sich nicht darum kümmern müssen, können Sie sich mit wichtigeren Programmierdetails beschäftigen. Stellen Sie sich vor, dass Sie weniger Speicher haben müssen, je weniger Sie produktiver arbeiten müssen. Letztendlich hat es mit der Abstraktionsebene zu tun, wenn man nicht kontrollieren muss, wie alle Zahnräder und Räder funktionieren, dann ist es am besten, nicht mit ihnen zu basteln.

In der Praxis werden Sie im Allgemeinen immer entweder Ints oder Longs verwenden (wenn Sie die zusätzliche Größe benötigen). Ich würde mich in diesen Tagen nicht um weniger kümmern, wenn ich nicht optimiert habe. Und denken Sie an die goldene Regel der Optimierung Optimieren Sie nicht, es sei denn, Sie müssen. Schreiben Sie zuerst Ihren Code und optimieren Sie ihn bei Bedarf..

Eine andere ähnliche Situation ist beim Entwerfen eines Datenbankschemas. Ich sehe oft, dass Leute ein Schema entwerfen und nur das erlauben, was sie für NVARCHAR-Spalten brauchen. Für mich ist das lächerlich, weil es eine Spalte mit variabler Länge ist, so dass Sie nicht Platz verschwenden, und indem Sie sich viel Platz geben, vermeiden Sie Probleme auf der Straße. Ich habe einmal für eine Firma gearbeitet, die interne Logging auf der Website hatte; Sobald ich auf IE8 aktualisiert habe, stürzt die Website ab. Nach einigen Untersuchungen fand ich heraus, dass das Logging-Schema nur 32 Zeichen für die Browser-ID-Zeichenfolge zuließ. Bei Verwendung von IE8 (mit Vis Studio und anderen Erweiterungen) wurde die Browser-ID jedoch größer als 32 und die Website funktionierte überhaupt nicht . Sicher, es hätte eine strengere Überprüfung der Länge und eine bessere Fehlerbehandlung seitens des dafür verantwortlichen Entwicklers geben können, aber durch die Berücksichtigung von 256 anstelle von 32 würde nicht nur der Absturz verhindert, sondern die Daten nicht abgeschnitten die db.

Ich schlage nicht vor, dass Sie Strings und Int64 für alle Ihre Datentypen verwenden (nicht mehr als ich vorschlagen, dass Sie alle Ihre SQL-Spalten auf NVARCHAR (4000) setzen), weil Sie Lesbarkeit verlieren. Aber wählen Sie einen geeigneten Typ und geben Sie sich viel Polsterung.

+0

Ich erinnere mich, dass jemand eine Spalte als 'VarChar (11)' entworfen hat. Was passiert, wenn wir einen Kunden haben, der 'VarChar (12)' braucht? – ChaosPandion

9

Die Verwendung einer Variablen, die kleiner als die native CPU-Registergröße ist, kann tatsächlich dazu führen, dass mehr Code ausgegeben wird.

Wie ein anderes Plakat sagte, mach dir keine Sorgen über Mikro-Optimierungen. Wenn Sie ein Leistungsproblem haben, erstes Profil. In 9 von 10 Fällen wird Ihr Leistungsproblem nicht dort sein, wo Sie es dachten.

3

Nein, ich glaube nicht, dass Sie dumm sind, das ist eine gute Frage!

Meine Meinung ist, dass die Verwendung stark typisierter Variablen eine bewährte Methode ist. In Ihrem Beispiel ist die Variable i immer positiv, also könnte es unsigned int sein.

Bei der Entwicklung von Programmen müssen wir berücksichtigen: 1) Größe 2) Geschwindigkeit und 3) die Kosten des Programmierers. Diese schließen sich nicht gegenseitig aus, manchmal tauschen wir die Größe für die Geschwindigkeit aus und natürlich kosten diejenigen, die das am besten können (großartige Programmierer) mehr als Anfänger.

Denken Sie auch daran, was auf Computer X am schnellsten ist, kann auf Computer B langsamer sein. Ist es ein 16-Bit-, 32-Bit-, 64-Bit- usw. Betriebssystem? In vielen Fällen möchten wir, dass eine Variable an Wortgrenzen für die Geschwindigkeit ausgerichtet wird, sodass die Verwendung von Variablen, die kleiner als ein Wort sind, keinen Speicherplatz spart.

So ist es nicht erforderlich am besten, die kleinstmögliche Variable zu verwenden, aber es ist immer beste Praxis, eine informierte Wahl zu treffen, um die beste Art zu verwenden.

2

Lokale Variablen wie Schleifenindizes sind billig. Wie viele Frames wirst du gleichzeitig auf dem Stapel haben? Fünfzig? Einhundert? Eintausend? Was ist der Aufwand für die Verwendung von tausend int Zähler anstelle von tausend byte Zähler? 3K? Sparen 3K die Nacharbeit, wenn sich herausstellt, dass ein paar dieser Arrays mehr als 255 Elemente benötigen?

Wenn Sie zig Millionen dieser Dinge zuweisen, dann kann das Quittieren der Bitzahl sinnvoll sein. Für Einheimische ist es eine falsche Wirtschaft.

Ein weiterer Faktor ist, was der Typ Ihren Lesern mitteilt. Zum Guten oder zum Schlechten legen die Leute sehr wenig Deutung auf eine int; Aber wenn sie eine byte sehen, werden sie es als etwas spezifisch Byte-orientiert interpretieren, wie zum Beispiel binäre Daten, die aus einem Stream kommen, vielleicht Pixel, oder ein Stream, der durch einen Encoder laufen muss, um ihn in eine Zeichenfolge umzuwandeln. Wenn Sie ein Byte als Schleifenzähler verwenden, werden viele Leser Ihres Codes aus dem Takt fallen, als sie stehen bleiben und sich fragen: "Warte, warum ist das ein Byte anstelle eines Int?"

2

diese Notiz In Anbetracht können Ihnen helfen:

Die Laufzeit optimiert die Leistung von 32-Bit-Integer-Typen (Int32 und UInt32), so diese Typen für Zähler verwenden und andere zugegriffen häufig integrale Variablen . Für Gleitkommaoperationen ist Double der effizienteste Typ , da diese Operationen hardwaremäßig optimiert sind.

Quelle: MCTS Self-Paced Training Kit (Exam 70-536): Microsoft® .NET Framework Application Development Foundation, Second edition

Anmerkung: Ich denke, das ist für x86-Rechner in Ordnung ist, aber für x64, weiß ich nicht.

Verwandte Themen