0

インライン複数メソッド呼び出しの後にバイトコードのシーケンスを生成します。インラインの初めに、インラインメソッドで例外が発生した場合には、まず既存の変数インデックスを新しいローカル変数番号にポップしました。この演算の結果、最終的なバイトコード内にいくつかのxLOADおよびxStoreシーケンスが生成されます。サンプルは次のとおりです。私はこれらの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 

おかげ

+0

データフロー分析? – immibis

答えて

1

はそれについては心配しないでください。メソッドが多く実行されると、JVMはおそらくそれを最適化します。その時点で、余分な負荷とストアが最適化されます。

マイクロオプティマイジングの価値があるかどうかを調べるためにプロファイリングしてみてください。

+1

実際、JITコンパイラの代わりにバイトコードレベルで最適化を行う予定です。私の目的は、バイトコードレベルで最適化が行われた場合に改善が見られるかどうかです。 –

+1

あなたが望めばそれを試すことができますが、JVMはバイトコードレベルの最適化を無関係にします。 – Antimony

+0

JVMがこれを最適化しているという証拠がありますか? – immibis