Frage

Ich habe eine Konsole-Anwendung, mit der Benutzer angeben können, die Variablen zu verarbeiten.Diese Variablen kommen in drei Geschmacksrichtungen:string, double und long (mit Doppel-und-lang bei weitem die am häufigsten verwendeten Typen).Der Benutzer kann angeben, was Sie Variablen wie und in welcher Reihenfolge, so dass mein system in der Lage sein, damit umzugehen.Zu diesem Zweck werden in meiner Anwendung hatte ich speichern diese als Objekt und dann Gießen/uncasting Sie als erforderlich.zum Beispiel:

public class UnitResponse
{
    public object Value { get; set; }
}

Mein Verständnis war, dass boxed Objekte nehmen Sie sich ein bisschen mehr Speicher (über 12 Byte) als ein standard-Wert geben.

Meine Frage ist:wäre es effizienter, verwenden Sie die dynamische keyword-zum speichern dieser Werte?Es könnte sich um das Boxen/unboxing-Ausgabe, und wenn es ist mehr effiziente, wie würde sich dies auf die Leistung auswirken?

BEARBEITEN

Um etwas Kontext und verhindern, dass die "sind Sie sicher, Sie sind mit genügend RAM zu sorgen" in meinen schlimmsten Fall habe ich 420,000,000 Datenpunkte zu kümmern (60 Variablen * die 7.000.000 records).Dies ist zusätzlich zu einer Reihe von anderen Daten, die ich über die einzelnen Variablen (darunter ein paar booleans, etc.).So die Verringerung der Speicher wird haben eine RIESIGE Auswirkungen.

War es hilfreich?

Lösung

OK, also die real hier steht die Frage "ich habe ein freakin' enorme Datenmenge, ich bin im Arbeitsspeicher gespeichert, wie Optimiere ich das System seine Leistung in sowohl Zeit als auch Speicherplatz?"

Einige Gedanken:

  • Sie sind absolut richtig zu hassen und zu fürchten Boxen.Boxen hat große Kosten.Erstens, ja, boxed Objekte zusätzlichen Speicher.Zweite, boxed Objekte auf dem heap gespeichert, nicht auf dem stack oder in Registern.Dritte, Sie sind Müll gesammelt;jedes einzelne dieser Objekte muss abgefragt werden, bei GC Zeit, um zu sehen, ob es enthält eine Referenz auf ein anderes Objekt, das es nie, und das ist eine Menge Zeit auf dem GC thread.Sie müssen natürlich etwas tun, um zu vermeiden, boxing.

Dynamische ain ' T it;es ist Boxen plus eine ganze Menge von anderen overhead.(C#'s dynamic ist sehr schnell im Vergleich zu anderen dynamischen dispatch-Systeme, aber es ist nicht schnell oder klein in absoluten zahlen).

Es ist grob, aber Sie könnten erwägen Sie die Verwendung einer struct, deren layout Aktien Speicher zwischen den verschiedenen Bereichen - wie eine union in C.Dabei ist wirklich, wirklich grob und überhaupt nicht sicher aber es kann helfen, in Situationen wie dieser.Machen Sie eine web-Suche für "StructLayoutAttribute";du wirst tutorials finden.

  • Long, double oder string, wirklich?Kann nicht in int, float oder string?Sind die Daten wirklich entweder im überschuss von mehreren Milliarden Größe oder Genauigkeit von 15 Dezimalstellen?Wäre das nicht int und float die Arbeit machen, die für 99% der Fällen?Sie sind halb so groß.

Normalerweise bin ich nicht empfehlen die Verwendung von float-mehr als doppelt, da es eine falsche Wirtschaft;Menschen oft sparen auf diese Weise, wenn Sie haben EINE Zahl, wie Sie die Einsparungen von vier bytes wird den Unterschied machen.Der Unterschied zwischen 42 Millionen Schwimmern und 42 Millionen verdoppelt, ist beträchtlich.

  • Gibt es eine Regelmäßigkeit in den Daten, die Sie ausnutzen können?Zum Beispiel, angenommen, dass von den 42 Millionen Datensätze, es gibt nur 100000 tatsächlichen Werte für, sagen wir, jede lange, 100000 Werte für jede Doppel -, und 100000 Werte für jede saite.In diesem Fall, Sie eine indizierte Speicherung von irgendeiner Art für die longs -, Doppel-und Streicher, und dann jeden Datensatz wird eine Ganzzahl, wo die niedrigen bits sind die index-und die oberen zwei bits geben an, welche Speicher zu Holen Sie es aus.Sie haben jetzt 42 Millionen Datensätze jeweils ein int, und die Werte werden gespeichert, die sich in irgendeiner schön kompakte form woanders.

  • Speichern Sie die boolsche Variablen als bits in einem byte;schreiben Eigenschaften zu tun, die bit-Verschiebung, get 'em out.Sparen Sie sich mehrere bytes auf diese Weise.

  • Denken Sie daran, dass der Speicher tatsächlich Speicherplatz;RAM ist nur ein bequemer cache auf top von es.Wenn die Daten set ist gehen zu werden zu gross, um Sie in den RAM dann etwas geht zur Seite, auf der Sie zurück auf die Festplatte und Lesen Sie es wieder in späteren;das könnte Sie oder könnte es sein das Betriebssystem.Es ist möglich, dass Sie mehr wissen über Ihre Daten Ort als das Betriebssystem hat.Sie schreiben, könnte Ihre Daten auf der Festplatte in der einige bequem navigierbaren form (wie ein b-Baum) und werden mehr effizient zu halten Sachen auf der Festplatte und nur um es in Erinnerung, wenn Sie es brauchen.

Andere Tipps

Ich denke, Sie schauen hier vielleicht das Falsche. Denken Sie daran, was Dynamik tut. Es Startet den Compiler in Bearbeitung zur Laufzeit erneut. Es lädt Hunderttausende von Bytes Code für den Compiler und gibt dann an jeder Anrufstelle Caches aus, die die Ergebnisse der frischem-emittierten IL für jeden dynamischen Betrieb enthalten. Sie geben ein paar hunderttausend Bytes aus, um acht zu sparen. Das scheint eine schlechte Idee zu sein.

Und natürlich sparen Sie nichts. "Dynamic" ist nur "Objekt" mit einem ausgefallenen Hut. "Dynamische" Objekte werden noch gebeugt.

Nein. dynamic hat zu tun mit Wie Operationen auf dem Objekt ausgeführt werden, nicht wie das Objekt selbst gespeichert wird. In diesem speziellen Kontext würden Werttypen immer noch unterbrochen.

Ist all diese Anstrengungen wirklich 12 Bytes pro Objekt wert? Sicherlich gibt es eine bessere Nutzung für Ihre Zeit, als ein paar Kilobyten (wenn das) RAM zu sparen? Haben Sie bewiesen, dass die RAM -Verwendung durch Ihr Programm tatsächlich ein Problem ist?

Nr. Dynamic speichert es einfach als Objekt.

Wahrscheinlich ist dies eine Mikrooptimierung, die wenig bis gar keinen Nutzen bietet. Wenn dies wirklich zu einem Problem wird, können Sie andere Mechanismen (Generika) verwenden, um die Dinge zu beschleunigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top