0

我在内联多个方法调用后生成一个字节码序列。在内联开始时,如果内联方法出现任何异常,我首先将现有变量索引重新设置为新的局部变量数字。此操作会导致最终字节码中出现多个xLOAD和xStore序列。示例是:可能优化字节码序列

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 

我想知道是否有一些众所周知的优化来消除这些xLoad/xStore序列。

谢谢

+0

数据流分析? – immibis

回答

1

别担心。如果该方法执行的很多,那么JVM可能会优化它,此时额外的加载和存储将被优化。

尝试分析它,看看它是否值得微优化。

+1

其实,我打算对字节码级进行优化,而不是让JIT编译器去做。我的目的是,如果在字节码级上进行优化,是否看到有改进 –

+1

如果需要,可以尝试,但JVM很可能会使任何字节码级优化无关紧要。 – Antimony

+0

你有证据证明JVM优化了这个吗? – immibis