2015-09-23 9 views
6

Ich schreibe eine Anwendung, wo die Leistung ziemlich kritisch ist. Ich bin ein wenig verwirrt darüber, welcher der effizienteste Datentyp für x64-CPUs ist.Effizienter Code: kurze vs Integer-Datentypen in VB.Net

MDSN sagt, dass "In some cases, the common language runtime can pack your Short variables closely together and save memory consumption." aber auch, dass "The Integer data type provides optimal performance on a 32-bit processor"

ich eine riesige Menge von Daten unter Verwendung von (durchschnittlich rund 5 Millionen Wert in einem gezackten Array [10 oder mehr] [30] [128128]) Bitmaps zu erzeugen in Echtzeit (Heatmaps der Datenwerte). Alle Datenpunkte sind ganze Zahlen zwischen 200 und 3500, also kann ich Short oder Integer verwenden. Was wäre am effizientesten?

Danke.

+2

Was bedeutet "riesig"? Besteht die Gefahr einer OutOfMemoryException mit Ganzzahlen? Ansonsten verwenden Sie Ganzzahlen, eine CPU ist so konzipiert, dass sie effizient mit 32-Bit-Werten arbeitet. –

+0

Im Durchschnitt 128 * 128 * 30 * 10 Datenwerte (4915200) in einem gezackten Array. Speicherverbrauch ist OK, ungefähr 230 MB auf meiner Maschine, die durchschnittliche Spezifikation für das Unternehmen ist. Der Grund, warum ich frage, ist, weil ich die Bilder in Echtzeit manipuliere (Farben ändern usw.), also brauche ich es so effizient wie möglich. – Absinthe

+0

Wenn Sie einen kleineren Speicherbedarf für die Rohdaten benötigen, verwenden Sie short. Wenn Sie ein schnelleres Rendern der Bilder wünschen, ist möglicherweise ein anderer Datentyp die richtige Wahl, aber es gibt keinen zu untersuchenden Code, der zeigt, wie die Daten verwendet werden. – dbasnett

Antwort

0

Als allgemeine Regel gilt, je weniger Speicher eine Variable verwendet, desto schneller wird sie verarbeitet und Sie haben eine bessere Speicherverwaltung, da Ihre Anwendung weniger davon verbraucht.

Kurz braucht nur die Hälfte des Speichers Integer braucht, wenn Sie nur eine 16-Bit-Nummer benötigen und Sie sicher sind, dass es nie größer wird, verwenden Sie Short.

+1

Danke für die Antwort. Wäre schön gewesen, wer das bewertet hat, um zu erklären warum. – Absinthe

1

Der Typ Int32 ist am effizientesten für reguläre Variablen, z. B. Schleifenzähler, sowohl in 32-Bit- als auch in 64-Bit-Anwendungen.

Wenn Sie mit großen Datenfeldern arbeiten, spielt die Effizienz beim Lesen/Schreiben eines einzelnen Wertes keine Rolle. Es kommt darauf an, auf die Daten zuzugreifen, um so wenig Speichercachespeicher wie möglich zu erhalten. Ein Speicher-Cache-Fehler ist im Vergleich zu einem Zugriff auf zwischengespeicherten Speicher sehr teuer. (Auch ein Seitenfehler (Speicherwechsel auf Platte) ist sehr teuer im Vergleich zu einem Speicher-Cache-Fehler.)

Um Cache-Fehler zu vermeiden, können Sie die Daten so kompakt wie möglich speichern, und wenn Sie die Daten verarbeiten, auf die Sie zugreifen können Es ist so linear wie möglich, so dass der Speicherbereich, auf den Sie zugreifen, so klein wie möglich ist.

Die Verwendung von Int16 ist wahrscheinlich effizienter als Int32 für jedes Array, das groß genug ist, um mehrere Cache-Blöcke zu überspannen, und ein Cache-Block ist im Allgemeinen nur ein paar Kilobyte.

Da Ihre Werte in nur 12 Bit gespeichert werden können, ist es möglicherweise sogar effizienter, jeden Wert in 1,5 Byte zu speichern, obwohl dies mehr Verarbeitung für die Verarbeitung der Daten bedeutet. Die Reduzierung von 25% der Datengröße könnte die zusätzliche Verarbeitung mehr als wettmachen.

+0

Danke für die Antwort. Ich verwende eine Schleife (Stepping 1) für jede Dimension des Arrays, um die Elemente zu iterieren, also nehme ich an, dass dies zu ziemlich linearem Zugriff führt. Können Sie bitte klarstellen, "es wäre sogar effizienter, jeden Wert in 1,5 Bytes zu speichern" - wie würden Sie das machen? Angesichts der Vielzahl von Antworten denke ich, es ist am besten, jede Option auf der Straße zu testen :) – Absinthe

+0

@Absinthe: Da es offensichtlich keinen 1,5 Byte Datentyp gibt, würden Sie einen Wert in Teilen von zwei Bytes oder mehrere Werte in einem größeren Daten speichern Art. Sie könnten die 12-Bit-Werte "a" und "b" in drei Bytes speichern: "aaaaaaaa aaaabbbb bbbbbbbb". Sie könnten auch fünf Werte (60 Bits) in einem "Int64" (8 Bytes) mit vier unbenutzten Bits speichern. Um einen 12-Bit-Wert aus dem 'Int64'-Array zu lesen, würden Sie' (arr [i/5] >> ((i% 5) * 12)) & 0xFFF' verwenden. – Guffa