【问题标题】:Possible optimize the bytecode sequence可能优化字节码序列
【发布时间】:2016-07-15 05:09:50
【问题描述】:

我在内联多方法调用后生成一个字节码序列。内联开始时,我首先将现有变量索引弹出到一个新的局部变量编号,以防内联方法出现任何异常。这个操作会在最终的字节码中产生一些 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 序列。

谢谢

【问题讨论】:

    标签: compilation bytecode java-bytecode-asm bytecode-manipulation jvm-bytecode


    【解决方案1】:

    别担心。如果该方法被执行很多次,JVM 可能无论如何都会优化它,此时额外的加载和存储会被优化掉。

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

    【讨论】:

    • 实际上,我打算在字节码级别进行优化,而不是让 JIT 编译器去做。如果在字节码级别进行优化,我的目的是否会看到改进
    • 你可以试试看,但是JVM很可能会渲染任何字节码级别的优化无关紧要。
    • 你有证据表明 JVM 对此进行了优化吗?
    • @immibis 你有证据证明它没有吗?我已经详细研究了 JVM,但我确实读到它做了这样的优化。如果你真的很担心,请自己分析一下。
    • @immibis:您可以从HotSpot white paper 派生它:“Java HotSpot 服务器编译器 [...] 使用基于高级静态单一分配 (SSA) 的 IR 进行优化。优化器执行所有经典优化,包括 [...] 公共子表达式消除、常量传播、global value numbering 和全局代码运动。”(我添加的链接)
    猜你喜欢
    • 2020-06-29
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多