Wie erkenne ich Boxing / Unboxing in einem dekompilierten Scala-Code?

8

In der akzeptierten besten Antwort auf diese Frage gibt es eine klare Erklärung, warum Boxen passiert.

Wenn ich jedoch den Code dekompiliere (mit Java Decompiler), kann ich scala.runtime.BoxesRunTime nicht verwenden. Außerdem, wenn ich den Code profile (mit JProfiler) kann ich keine Instanzen von BoxesRunTime sehen.

Also, wie sehe ich wirklich einen Beweis für das Boxen / Unboxing?

    
Nermin Serifovic 13.02.2011, 05:04
quelle

2 Antworten

7

In diesem Code:

%Vor%

Der Aufruf von bar sollte zuerst die ganze Zahl einkisten. Kompilieren Sie mit Scala 2.8.1 und verwenden Sie:

%Vor%

, um den Bytecode zu sehen, der für die Methode main der Klasse Main erzeugt wurde:

%Vor%

Sie können den Aufruf von BoxesRunTime vor dem Aufruf von bar sehen.

BoxesRunTime ist ein Objekt, das Box-Methoden für primitive Typen enthält. Es sollte also genau eine Instanz geben. Der Trick dabei ist, dass diese bestimmte Datei in der Bibliothek in Java geschrieben wurde und die Konvertierungen statische Methoden sind. Aus diesem Grund gibt es zur Laufzeit keine Instanzen davon, obwohl es sich in Scala-Code anfühlt, als ob es ein Objekt wäre.

Sie sollten wahrscheinlich nach Boxed-Primitiven (z. B. java.lang.Integer) mit JProfile suchen, obwohl ich nicht sicher bin, wie die JVM funktioniert und ob sie den Code möglicherweise zur Laufzeit neu schreibt und ihn optimiert, um ein Boxing zu vermeiden. Meines Wissens sollte es keine Spezialisierung geben (aber ich glaube, dass CLR das tut). Ein paar Microbenchmarks mit und ohne Boxsituation sind eine andere Möglichkeit herauszufinden, was zur Laufzeit passiert.

BEARBEITEN:

Das obige geht davon aus, dass ein Typparameter nicht mit der Annotation @specialized annotiert wurde. In diesem Fall kann das Boxen / Unboxing vermieden werden. Bestimmte Klassen in der Standardbibliothek sind spezialisiert. Siehe diese Seite .

    
axel22 13.02.2011, 08:45
quelle
1

Gegeben das folgende Test.scala-Programm:

%Vor%

Wenn ich mit scalac -Xprint:jvm Test.scala kompiliere, bekomme ich dieses Snippet, was darauf hindeutet, dass eine Spezialisierung stattfindet (sorry für wide paste):

%Vor%

Könnte sein, dass Sie keinen Beweis für das Boxen in Bytecode sehen ...

    
huynhjl 13.02.2011 16:25
quelle

Tags und Links