0

Ich erzeuge eine Sequenz von Bytecode nach Inline mehrere Methodenaufruf. Zu Beginn von Inline habe ich zuerst existierende Variablenindizes zu einer neuen lokalen Variablennummer im Falle einer Ausnahme in der Inlined-Methode gefüllt. Diese Operation führt zu einer Anzahl von xLOAD- und xStore-Sequenzen in den endgültigen Bytecodes. Die Probe ist:Mögliche Optimierung der Bytecode-Sequenz

GETFIELD DYNGuardWithTestHandle1456194204777.guard : Ljava/lang/invoke/MethodHandle; 
    INVOKEVIRTUAL java/lang/invoke/MethodHandle.invokeExact()Z 
    IFEQ L0 
    ALOAD 0 
    ALOAD 1 
    ALOAD 2 
    ALOAD 3 
    ALOAD 4 
    ASTORE 5 
    ASTORE 6 
    ASTORE 7 
    ASTORE 8 
    ASTORE 9 
    ALOAD 9 
    ALOAD 8 
    ALOAD 7 
    ALOAD 6 
    ALOAD 5 
    ASTORE 10 
    ASTORE 11 
    ASTORE 12 
    ASTORE 13 
    ASTORE 14 
    ALOAD 14 
    GETFIELD DYNGuardWithTestHandle1456194204777.trueTarget_guard_next : Ljava/lang/invoke/MethodHandle; 
    LDC "fd1a2fc6-03ef-4fd8-a2ae-ebbaa274fa97" 
    INVOKESTATIC java/lang/invoke/ObjectTransfer.peek (Ljava/lang/String;)Ljava/lang/Object; 
    CHECKCAST org/jruby/RubyClass 
    ALOAD 11 
    INVOKEVIRTUAL java/lang/invoke/MethodHandle.invokeExact (Lorg/jruby/RubyClass;Lorg/jruby/runtime/builtin/IRubyObject;)Z 
    GOTO L1 
    L1 
    IFEQ L2 
    ALOAD 9 
    ALOAD 8 
    ALOAD 7 
    ALOAD 6 
    ALOAD 5 
    ASTORE 15 
    ASTORE 16 
    ASTORE 17 
    ASTORE 18 
    ASTORE 19 
    ALOAD 19 
    ALOAD 16 
    ALOAD 18 
    ALOAD 15 
    ASTORE 20 
    ASTORE 21 
    ASTORE 22 
    ASTORE 23 
    ALOAD 23 
    ALOAD 22 
    CHECKCAST org/jruby/RubyString 
    ALOAD 21 
    ALOAD 20 
    ASTORE 24 
    ASTORE 25 
    ASTORE 26 
    ASTORE 27 
    ALOAD 27 
    ALOAD 26 
    ALOAD 25 
    ALOAD 24 
    ASTORE 28 
    ASTORE 29 
    ASTORE 30 
    ASTORE 31 

Ich frage mich, ob es gibt einige bekannte Optimierung diese xload/xSpeichern Sequenz zu eliminieren.

Danke

+0

Datenflussanalyse? – immibis

Antwort

1

Mach dir keine Sorgen darüber. Wenn die Methode sehr oft ausgeführt wird, wird sie wahrscheinlich von der JVM optimiert, und die zusätzlichen Ladungen und Speicher werden dann optimiert.

Probieren Sie es aus, um zu sehen, ob es sich lohnt, Mikro-Optimierungen durchzuführen.

+1

Eigentlich plane ich, Optimierung auf der Bytecode-Ebene zu machen, anstatt den JIT-Compiler zu verlassen. Mein Ziel, ob es dort zu sehen gibt, ist eine Verbesserung, wenn die Optimierung auf der Bytecode-Ebene durchgeführt wird –

+1

Sie können es versuchen, wenn Sie möchten, aber die JVM wird wahrscheinlich jede Bytecode-Ebenen-Optimierung irrelevant machen. – Antimony

+0

Haben Sie Beweise dafür, dass die JVM dies optimiert? – immibis