問題タブ [invokedynamic]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - MethodHandle をメソッド参照 (ここでは Function) に変換します
最後の課題作品を手に入れることは可能ですか?逆の方法が機能しない:メソッド参照を MethodHandle に変換することは可能ですか?
コピーして貼り付けることができる別の例を次に示します。
java - Lambda は FunctionalInterface の署名に一致しますが、「一致しません」。引数が渡されたことをどのように説明しますか?
現在、このプロジェクトに取り組んでいます。驚くほどうまく機能します。
しかし、もう一度 README を読み直した後、私を悩ませている何かを文書化する方法について疑問に思うようになりました...
例を引用すると、例外がスローされる可能性があることを少し忘れると、次のようになります。
わかった。さて、Path
絡み方はこちら。もちろん、 は渡しませんLinkOption
。
繰り返しますが、例外がスローされることを少し忘れましょう。
Streamは引数として.map()
aを取ります。Function
のこのインターフェイスは、次のFunction<T, R>
ように定義されます。
しかし、私が使用しているメソッドは引数を受け入れません。一見、 a と一致しないように見えFunction
ますよね?それ以外で...
次のように記述できます。
したがって、メソッド参照に引数がない場合、またはそのようなものがある場合、使用されるメカニズムは「ストリームオブジェクト」でメソッドを呼び出すことができるように見えます...
それに応じてこれを文書化したいのですが、ここに何かが欠けています。
私は何が欠けていますか?
java - MethodHandle InvokeExact パラメータ
メソッド ハンドルのメソッド パラメータがわかりません。まず、以下に示すように、test メソッド ハンドルを使用してガードを作成します。
私にとっての問題は、パラメーターが 3 つのメソッド ハンドル (test、trueTarget、および faliover) にどのように渡されるかということです。1、invokeExact の最初のパラメーター「result」がレシーバーとしてテスト ガードに渡され、2 番目のパラメーター「data」が startWith に渡されます。
But the these three parameters are passed to the falseTarget as:
So, what's the rule for parameters passing and how do they match to the methods referenced by a method handle?
jvm - インボークダイナミックの結果はどのように保存されますか?
Java 8 では、第一級関数のサポートが導入され、関数を変数に割り当てることができます。この場合、変数は関数型である必要があり、関数型インターフェイス(抽象メソッドが 1 つだけのインターフェイス)によって定義されます。
したがって、次の定義を持つインターフェイスI
とクラスの例を考えてみましょう。A
型の変数にI
のインスタンスA
または のメソッドへのメソッド参照bar
を割り当てることができますA
。I
両方とも、次のようなtype の変数に格納できます。
前のコードをコンパイルした結果のバイトコードを分析すると、次のようになります。
それi1 = new A();
は、対応する命令がと互換性7: astore_1
のある のインスタンスを格納していることは明らかです。しかし、 の結果として、 の結果を保存しています。A
I
i2 = A::bar
8: invokedynamic #4, 0
つまり、 an の結果invokedynamic
は常に、メソッド参照で割り当てる変数の型である対象の型のインスタンスになるということです。
groovy - --indy を使用すると、バブル ソートの実行が 5 倍遅くなります
Groovy を少しいじっ--indy
て、パフォーマンスに顕著な影響があるかどうかを確認するために、バブル ソートの実装を作成しました。
基本的に、1,000 個のランダムな整数のリストを 1,000 回ソートし、リストをソートするための平均実行時間を測定します。
リストの半分はInteger[]
で、残りの半分はArrayList<Integer>
です。
結果は本当に私を混乱させます:
ベンチマークの実行中の CPU 使用率を見ると、CPU 使用率は、--indy
なしでコンパイルした場合よりもはるかに高くなっています。
これに興味をそそられたので、もう一度ベンチマークを実行しましたが、今回は Yourkit エージェントと CPU トレースを有効にして実行しました。記録された呼び出しツリーは次のとおりです。
パフォーマンス チャートは次のとおり--indy
です。コードが非常に遅いため、タイム スケールが異なることに注意してください。
ご覧のとおり、CPU 使用率は、なしでコンパイルすると 1 つのコアの 100% (グラフでは 12.5%) で安定しますが、でコンパイルする--indy
と 12.5% から ~35% の間で大きく変化し--indy
ます。さらに紛らわしいのは、Yourkit が 1 つのライブ スレッドしか報告しないことです (そして、私のコードはメイン スレッドのみを使用します)。
でコンパイルされたコード--indy
も、開始時に多くのカーネル時間を使用しますが、これはしばらくすると低下し、0% で安定します。その時点で、コードは少し高速化され (ヒープ使用率の増加率が増加)、CPU 使用率が増加します。 .
誰かが私にこの動作を説明できますか?
バージョン:
BubbleSort.groovy:
動作に関連しない限り、バブル ソートの実装の最適化には興味がinvokedynamic
ありません。ここでの目的は、可能な限り最高のパフォーマンスを発揮するバブル ソートを記述することではなく、--indy
パフォーマンスに大きな悪影響を与える理由を理解することです。
アップデート:
私はコードを JRuby に変換し、同じことを試してみましたが、結果は似ていますが、JRuby は以下を使用しないとそれほど速くはありませんinvokedynamic
。
更新 2:
リストを半分の時間に変更するコードを削除すると、Integer[]
パフォーマンスが大幅に向上しますが、なしでも高速--indy
です。
JRuby で同じことを行うと、invokedynamic
より高速になります。
java - 戻り値の型 (強制キャスト) が MethodHandler のパフォーマンスにおいて重要なルールを果たしているのはなぜですか?
私は単純なプロジェクトに取り組んでおり、Bean プロパティを取得する必要があります。まず、リフレクションを使用します。次に、パフォーマンスを向上させるために、invokedynamic とメソッド ハンドラーについて調査を行いました。
インボークinvokeExact
はリフレクションよりもはるかに高速ですが、リフレクションよりもはるかに低速です。
テスト環境:
- Win7 32ビット
- ジャワ 7 U 80
- コアによるCPU 3.06GHZ
私が得たtp / msはこれについてです:
パフォーマンス テストの出力は次のとおりです (2 回実行しました)。
ここに私のテストコードがあります:
invokeExact
コンパイル時に正確な戻り値の型がわからないため、ユース ケースを満たすことができません。リターンの型(強制キャスト)がMethodHandle
の性能を左右する重要な鍵のようです。
MethodType
の戻り値の型が正確であるため、これは予期された結果ではないようです。パフォーマンスを向上させるためにフォースキャストを行うことが依然として重要なのはなぜですか?
これに関する詳細を説明するドキュメントはありますか? また、リフレクションとメソッド ハンドラの使用の impl の詳細を比較するドキュメントはありますか?
java - InvokeDynamic 引数の動的タイプ
動的な型とメソッド ディスパッチをサポートするために、私のプログラミング言語には という型が導入されていdynamic
ます。型が の呼び出し先でメソッドを呼び出す場合dynamic
、コンパイラはまず呼び出し先とすべての引数をスタックにプッシュし、次にinvokedynamic
通常の命令の代わりに命令を生成しinvoke*
ます。この命令は、 というクラスの特別なブートストラップ メソッドを指していDynamicLinker
ますが、呼び出されたときに利用できるのは静的な型だけです。
私の問題invokedynamic
:命令に渡された引数の実行時型を取得するにはどうすればよいですか?
java - Java 8 Update 51 (sun-jdk-8u51) 448 の System::gc Runnable 引数を使用した null MethodHandle invokeExact 呼び出し後のランタイム致命的エラー
概要
Runnable メソッド参照 (System::gc) の 448 インスタンスで null MethodHandle の invokeExact メソッドを呼び出すメイン メソッドを持つインターフェイスをコンパイルできました。
インターフェイスを実行すると、Java ランタイム環境によって致命的なエラーが検出されました。
- pc=0xb71b9bde、pid=12918、tid=3030936432 の SIGSEGV (0xb)
- JRE バージョン: Java(TM) SE ランタイム環境 (8.0_51-b16) (ビルド 1.8.0_51-b16)
- Java VM: Java HotSpot(TM) クライアント VM (25.51-b03 混合モード linux-x86 )
- 問題のあるフレーム:
- V [libjvm.so+0x507bde] SignatureIterator::parse_type()+0x1ce
ソースコードと実行結果のリンク: http://ideone.com/3oh7Uk
ソース
結果