.NET Boxen / Unboxing vs Casting-Leistung

8

Ich versuche zu verstehen, welche von zwei Lösungen aus einer Leistungsperspektive bevorzugt wird. Zum Beispiel habe ich zwei Teile Code:

1) Boxen / Unboxing

%Vor%

2) Casting (IntObj hat die Eigenschaft int Value, um int zu speichern)

%Vor%

Was ist der Unterschied in der Speicherverwaltung zwischen diesen Beispielen? Gibt es einen schnelleren Weg, solche Operationen durchzuführen?

HINWEIS: Session ist nur zum Beispiel, es kann ein beliebiges Dictionary<string, object>

sein     
Alex Dn 06.09.2012, 07:05
quelle

4 Antworten

7

Es sieht so aus, als würden Sie hier das manuelle Boxen mit eingebautem Boxen vergleichen. Das eingebaute Boxen wurde stark optimiert - ich würde hier also keinen großen Unterschied erwarten, aber wir können es überprüfen. Beachten Sie, dass beide die gleiche Auswirkung auf den Speicher haben: ein Heap-Objekt, das ein int -Feld enthält, pro int boxed / wrapped.

Das Folgende zeigt ziemlich viel identische Zeiten für die zwei angenäherten; Ich würde also sagen, boxen Sie es direkt / integriert.

Hinweis: Führen Sie es im Freigabemodus aus, ohne einen Debugger (idealerweise in der Befehlszeile). Beachten Sie, der erste Anruf ist da, um alles vorzuspielen.

%Vor%     
Marc Gravell 06.09.2012, 07:30
quelle
4

Was ist also schneller, DIY-Boxen mit einem IntObj oder dem eingebauten Boxen?

Meine Vermutung wäre die eingebaute Vielfalt. Die Wahrscheinlichkeit ist groß, dass beide Compiler darauf optimiert sind.

  

Gibt es einen "schnelleren" Weg, um solche Operationen durchzuführen?

Der bevorzugte Ansatz besteht immer darin, es für große Datensätze zu vermeiden. Für kleine Sets ist es einfach egal.

    
Henk Holterman 06.09.2012 07:08
quelle
2

Der schnellste Weg, etwas zu tun, ist es gar nicht. Versuchen Sie, Ihre Daten neu zu strukturieren, um eine große Menge an Boxing zu vermeiden, um mehr Typsicherheit, Lesbarkeit und potentielle Performance gleichzeitig zu erreichen.

Ich finde es unwahrscheinlich, dass Sie eine große Menge nicht zusammenhängender ganzzahliger (oder anderer Werttyp-) Elemente im untypisierten Wörterbuch speichern müssen. Normalerweise sind die Werte in einigen Objekten organisiert, die zusammen Sinn ergeben. In diesem Fall speichern Sie Top-Level-Objekte im untypisierten Dictionary und benötigen nur einen Cast. Für tiefere Elemente würden Sie stark typisierte Klassen verwenden (wie Dictionary<string,int> ), wo dieses Problem bereits gelöst ist, da kein Boxing benötigt wird.

Wenn Sie denken, dass Sie in Ihrem Fall wirklich eine große Anzahl von int (oder anderen Werttyp-Elementen) in string = & gt; opbject map speichern müssen, sollten Sie sehr einfach selbst Messungen mit your Geben Sie Ihre Ziele an, um festzustellen, ob eine der beiden Versionen erhebliche Vorteile bietet. Wenn beide Ihre Ziele erfüllen (likly) - wählen Sie eine, die am meisten lesbaren Code produziert (ich würde für mich wäre es die erste Variante).

    
Alexei Levenkov 06.09.2012 07:28
quelle
0

Ich kategorisierte verschiedene Arten von IL-Anweisungen, die vom C # -Casting-Operator erzeugt wurden:

Boxen (Box-AWL-Anweisung) und Unboxing (unbox AWL-Anweisung) Casting durch die inhertiance-Hierarchie (wie dynamic_cast in C ++, verwendet Casclass-IL-Anweisung zu überprüfen) Casting zwischen primitiven Typen (wie zB static_cast in C ++, gibt es viele IL-Anweisungen für verschiedene Arten von Umwandlungen zwischen primitiven Typen) Aufrufen von benutzerdefinierten Konvertierungsoperatoren (auf der IL-Ebene sind dies nur Methodenaufrufe an die entsprechende op_XXX-Methode).

Der Unterschied besteht darin, dass Casting zusätzlichen Speicher zuweist, wenn ein neuer Referenztyp erstellt wird.

    
Gyan Chandra Srivastava 06.09.2012 07:15
quelle

Tags und Links