2010-08-17 9 views
6

Ist es sinnvoll, dies zu tun?Boxen, eine Sache der Vergangenheit?

public static void Write<T>(T value) 
{ 
    textWriter.Write(value.ToString()); 
} 

... wie auf diesem vermeintlichen:

public static void Write(object value) 
{ 
    textWriter.Write(value.ToString()); 
} 

die offensichtliche null dereferenzieren Möglichkeit Abgesehen von, Wenn ich wo viele Werttypen mit dieser Methode zu schreiben, wäre nicht die ehemalig viel sein Besser, weil es eine eigene Version der Write-Methode hat, die aufgerufen wird, oder wird es einfach die Binärdatei aufblähen, wenn viel zusätzlicher Code generiert wird?

Die Performance-Implikation einer solchen Sache mag vernachlässigbar sein, aber ich bin neugierig, es ist viel kompakter als eine Überladung für jeden Werttyp in der BCL, wie die meisten Autoren in der BCL bereits tun.

Antwort

7

Von dem, was ich verstehe, tritt in beiden Fällen Boxen auf.

Letzteres ist offensichtlich, da der Wert bereits eingerahmt ist.

Ersteres ist weniger offensichtlich, aber da eine virtuelle Methode für einen Werttyp aufgerufen wird, muss sie in einem Rahmen dargestellt werden, um die callvirt auszuführen.

Bearbeiten: Ich habe nur die emittierte IL überprüft, und es gibt keine expliziten Boxing im generischen Fall auftritt. Etwas läutet jedoch.

Bearbeiten 2: Ich könnte mich mit dem Fall über Schnittstellen verwirrt haben. Dort tritt eindeutig Boxen auf.

bearbeitet 3: Boxen auftreten, wenn ToString() im Werttyp nicht außer Kraft gesetzt wird.

ich dieses von ECMA-335 Teil 3 pg 25 (nur der letzte Fall der Feststellung):

Wenn thisType ist ein Wert, Typ und thisType hat Methode nicht implementieren dann ptr dereferenziert, geschachtelt und als ‚dieser‘ Zeiger auf das callvirt der Methode

kann nur dieser letzte Fall bestanden auftreten, wenn 0.123.Methode wurde definiert auf System.Object, System.ValueType, oder System.Enum und nicht durch überschrieben thisType. In diesem letzten Fall die Boxen bewirkt, dass eine Kopie der das ursprüngliche Objekt gemacht werden, jedoch, da alle Methoden auf System.Object, System.ValueType und System.Enum Sie den Zustand des das Objekt nicht ändern, kann diese Tatsache nicht erkannt.

bearbeiten 4:Here is a similar question on SO.

+0

Sind alle Methodenaufrufe wirklich virtuell? Ich vermutete nur die Interface-Situation, um das Boxen nötig zu machen, @Edit 3 nun, das ist etwas überraschend. Ich würde denken, dass es andersherum ist, aber mit Werttypen ist es ein bisschen anders, da Sie keine Vererbung haben können, also kann es wirklich keine virtuellen Methoden auf Werttypen und BTW geben, das ist eine großartige Antwort! –

1
  • virtuelle Anrufe können Boxen erfordern (wie leppie schon gesagt)
  • die generische ist kompakter in der Quelle, aber nicht in JIT'ed Code

Leistung Betrachtet:

  • das Generische reduziert die binäre Größe etwas. JIT-Zeit und Codelokalität bleiben gleich, da nur die erforderlichen Übersteuerungen sowieso Jitter sind
  • Wenn die Methode nicht so simpel ist wie im Beispiel, wird die Boxing-Lösung weniger JIT-Aufrufe beinhalten und die Codegröße verringern (wodurch auch die Lokalität verbessert wird) . Dies ist ein kumulativer Effekt, der nur in extremen Fällen schwer zu messen ist.

Das Wesentliche ist: Es gibt keine perfekte Methode für alle Umstände.

+0

Eigentlich habe ich gerade entdeckt, dass Boxen nicht in allen Fällen notwendig ist (zB wo eine virtuelle Methode in einem Werttyp überschrieben wird) :) Siehe meine Modifikation. – leppie

+0

ahh .. interessant. Hinzugefügt Wiesel Worte;) – peterchen

1

Ja, es wird in den meisten Fällen das Boxen vermeiden. Ich würde jedoch nicht erwarten, dass dies in den meisten Fällen zu signifikanten Leistungsunterschieden führt. Wie Sie selbst sagen, ist es wahrscheinlich vernachlässigbar.

Ich würde argumentieren, dass es tut fügen Sie ein bisschen eine Last in Bezug auf die Lesbarkeit obwohl. Ich vermute, dass die meisten Leute ein bisschen mehr kognitive Last haben, wenn sie versuchen, eine generische Methode zu verstehen, als sie eine einfache Methode unter object machen. Wer wird diese Methode anwenden, und sind sie mit Generika ausreichend zufrieden, dass es sie nicht stört?

Verwandte Themen