問題タブ [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.

0 投票する
1 に答える
356 参照

clojure - jitを使用することで、invokeDynamicの必要性を減らすべきではありませんか?

invokeDynamicについて多くのことを読んだ後、私はまだ少し混乱しています.1つの繰り返しのテーマは、Clojureが実際にそれを必要としないか、少なくともJVM上の他の動的言語実装(Jruby、JPython、Groovyなど)よりも必要が少ないことです。 。)。私はすべての詳細を理解していませんでしたが、型の注釈があることが主な理由であるように思われます。これにより、動的ディスパッチの問題が単純に解消されます。

1-複雑なメソッドディスパッチシナリオを効率的に実装する方法としてinvoke-dynamicを説明するのは安全ですか?(それ以上ありますか?)

2- jitを使用することで、invoke-dynamicの必要性を排除するべきではありませんか?問題はランタイムタイプ情報の欠如から生じているようであり、jitはこの情報を持っている必要があります。

3-JRubyはブースにjitがあり、invokdynamicを使用しているようです。なぜですか?

0 投票する
1 に答える
178 参照

java - JDK 7 の Linkage#registerBootstrapMethod

JDK 7 のプレビュー リリースには、Linkage と呼ばれるクラスで invokedynamic 呼び出しサイトのリンクを制御するメソッドのコレクションがありました。たとえばregisterBootstrapMethod。JDK の最終リリースでは、これらはどうなりましたか?

0 投票する
2 に答える
175 参照

java - メソッドハンドル操作

アスペクトJとinvokedynamicを使った作業では、ポイントカットが呼び出されたメソッドと一致するときに、メソッドにアドバイスを織り込む必要があります。最初に、スクリプト内の invokedynamic-instruction のブートストラップ メソッドを独自のものと交換しました。ここで、ブートストラップ メソッドで、呼び出されたメソッドを最初に呼び出す CallSite を返し、その後、定義したアドバイスを返したいと考えています。

問題は、元のブートストラップ メソッドで使用されたものと同じ型シグネチャを持つ 1 つの MethodHandle から CallSite ビルドを返さなければならないことです。2 つのメソッドハンドル (元の + アドバイス) を新しいものに結合し、それを返される CallSite に使用することを考えました。しかし、それを行うための適切な方法が見つかりません。MethodHandles.foldArguments は有望なようですが、私にはうまくいきませんでした。もう 1 つのアイデアは、元のメソッド ハンドルとアドバイスを呼び出すラッパー メソッドから MethodHandle を構築することでしたが、問題は正しい型シグネチャです。

誰か私にアイデアや提案はありますか? アドバイスを使用して MethodHandle にパッチを適用するにはどうすればよいですか?

ありがとうございました。

0 投票する
2 に答える
8482 参照

groovy - Java 7も使用している場合、Groovyの@CompileStaticを使用する必要があります

「Groovy2.0の新機能」を読みましたが、@CompileStaticをいつ使用するかについて少し混乱しています。この記事では@CompileStatic、Java7の動的な呼び出し部分を利用できなかった開発者向けにアノテーションが追加されたと述べています。

したがって、パフォーマンスの向上を求める開発者は、JDK 7で実行できない場合、Groovy 2.0で大きな変更は見られません。幸い、Groovy開発チームは、タイプチェックを許可することで、これらの開発者が他の利点の中でも興味深いパフォーマンスの向上を得ることができると考えました。静的にコンパイルされるコード。

私の質問は、JDK 7を使用していて、指示に従って--indyフラグを追加する場合@CompileStatic、パフォーマンスの向上を確認するために追加する必要がありますか? このブログは私がそうすることを示唆していますが、彼がEclipse内でそれを行ったことを考えると、彼が正しくコンパイルしたかどうかはわかりません。

更新:フィボナッチコードのさまざまな順列を実行したときの統計は次のとおりです。

注:機能が独立していることを理解した今、この質問は少し混乱しているようです。質問の基本は、2つの機能が関連していると思わせたメモからの混乱にあるため、質問の文言を変更せず、違いを説明する受け​​入れられた回答を許可するのは理にかなっていると思います。

0 投票する
1 に答える
475 参照

jruby - JRuby java.lang.ClassCastException

http://www.javaworld.com/javaworld/jw-07-2006/jw-0717-ruby.htmlの小さな Jruby スクリプトを使用して、invokedynamicをテストしました。

しかし、JRuby で Java クラスファイルにコンパイルしてから実行しようとすると、次の例外が発生します。

私のシステム:Windows 7 64ビット、JRuby 1.7.2上のJDK 1.7.0_09 64ビット

使用したコマンドライン:

しばらく前に、Linux マシンと Windows jdk8 でテストしましたが、同じ結果が得られました。JDK8では機能しましたが、別のプロジェクトでクラスファイルを使用すると問題が発生しました。

誰かがそれを修正する方法を知っていますか? Java 7 の indy で JRuby を使用するにはどうすればよいですか?

0 投票する
2 に答える
632 参照

groovy - どのような状況で、Groovy2.0 + invoke dynamicでパフォーマンスの向上が期待できますか?

HavlakベンチマークのJavaコードをRobertHundt(リンクを参照)からGroovyに移植しました。ここで、Groovy 2.1.1を使用して、動的呼び出しを使用してベンチマークを実行しますが、計算にかかる時間はほぼ同じです。動的呼び出しを有効にするために何をしましたか?groovy--indy.jarsをgroovy-2.1.1\indyからgroovy-2.1.1\libにコピーしました。次に、groovy-2.1.1 \ libで、名前に「indy」が含まれていないすべてのgroovy.jarを削除しました。その後、IntelliJ IDEAで、[ファイル]>[設定]>[コンパイラ]>[Groovyコンパイラ]>[動的サポートの呼び出し]のフラグを有効または無効にしました。

私がインディサポートを正しくオンにしたかどうかを人々に見てもらうために、これを伝えているだけです。しかし、これは私の質問ではありません。私の質問は、動的呼び出しにより、どのような状況で計算時間の高速化が期待できるかということです。私はそれについての記事を読みましたが、invoke dynamicが行うことについてそこで説明されていることを、「この種のコードはindyサポートを使用するとより高速に実行される」というステートメントに変換するのは困難です。Havlakベンチマークは、セッターを呼び出すことで値が変更される多くのループを実行します。

問題をある程度理解している人がここにいくつかの説明をドロップしてくれると嬉しいです:-)。

ありがとう、オリバー

0 投票する
1 に答える
1162 参照

java - Javassist で Invokedynamic を生成する

私は比較的単純なことをしようとしていると思います。メソッド doSomething(int) の次の Java バイトコードを例にとります。

このバイトコードは、呼び出しを静的ヘルパーに転送するだけです。

私が今やりたいことは、Javassist を使用して、invokestatic を invokedynamic に置き換えることです。私はASMでこれを行う方法を知っているので、純粋な好奇心のためにそれがどのように機能するかを知りたいと思っていると仮定してください. ここに私が持っているいくつかの質問があります:

1) 次は正しいですか: javassist の CtMethod.instrument() メソッドまたは CtMethod.insertAt() メソッドを使用できません。これらのメソッドは、有効な Java 式を含む文字列を想定しており、Java 構文で invokedynamic を記述できないためです。

2) invokestatic へのパラメーターは、invokevirtual または invokestatic のパラメーターと同じように処理されますよね? つまり、invokevirtual の場合と同じように、invokedynamic の前にパラメーターをスタックに配置しますか?

3) Javassistを使用してinvokedynamicバイトコードを作成するサンプルコードはありますか?

これは私がこれまでに知っていることです: addInvokedynamic() メソッドを持つ Bytecode オブジェクトを作成できます。ただし、これは BootstrapMethodsAttribute 内の BootstrapMethod のインデックスを想定しています。次に、BootstrapMethod は、メソッド参照などを必要とする定数プール内のメソッド ハンドル情報のインデックスを期待します。したがって、基本的には、定数プール エントリ全体を自分で管理する必要があります。これは問題ありませんが、正しく理解できず、後で奇妙な問題が発生するのではないかと心配しています。これを行う簡単な方法 (ヘルパー メソッドなど) はありますか? 私が持っているコードは大まかに次のようになります(上記のinvokestaticを実際に「書き直す」わけではありませんが:

あなたの助けと時間をありがとう!

0 投票する
1 に答える
907 参照

performance - grails 2 / groovy 2 / JDK7: メリットを享受するには?

私は Grails が大好きですが、Groovy 2 のパフォーマンス上のメリットを得るにはどうすればよいか考えていました。問題は、「Java に近い」パフォーマンスを向上させるために、開発環境と運用環境をどのように構成するかです。

だから、私がセットアップした場合:

すぐに使用できる webapp を実際に高速化するためのガイドラインはありますか?

また、Grails Web アプリケーションのコードベースでリファクタリングを行う必要はありますか? つまり、コントローラーでサービスを参照するような依存関係の挿入は、静的にコンパイルする必要がありますか、それともドキュメントにあるようにコードを書き続ける必要がありますか?

ps: Groovy @CompileStatic と Grailsが関連する質問かもしれません...

0 投票する
1 に答える
1160 参照

groovy - Groovy 呼び出し動的パフォーマンス

次の Groovy コードのスニペットで、予想外のベンチマーク結果が得られました。

コンパイル済みのクラス ファイルを使用し、それを Reflection API で呼び出したと言わざるを得ません。語るべき長い話 (聞かないでください ;)。第一印象として、私は 10 ラウンド + 5 回のウォームアップを 10000 ループで使用しました。(junit-benchmark フレームワーク) 私の JDK は Verison 1.7.0_09 で、Groovy 2.1 を使用しました。このコードは、invokedynamic サポートありとなしで 2 回コンパイルしました。要点は、invokedynamic を使用したベンチマークは、通常のコンパイル済みのものよりもはるかに長い時間がかかったということです。また、フィボナッチ数を使用して他のベンチマークも行いましたが、予想どおりに動作しました (indy は約半分の時間かかりました)。

ここで何が問題なのか誰か知っていますか?

ありがとう。

0 投票する
2 に答える
404 参照

java - InvokeDynamic: 呼び出しサイトのバイトコードをブートストラップ メソッドに渡して実行することは可能ですか

カスタム Java コンパイラまたはバイトコード エージェントがあるとします。

合成メソッド内でバイトコードを「ホスト」するために匿名クラスを生成する必要がない方法で、呼び出しサイトのバイトコードをブートストラップ ハンドラーに渡すことは可能ですか?

つまり、バイトコードを渡したら、できるだけ少ないオーバーヘッドでそれを実行したい (バイトコードが機能するのにちょうどいいスタックとローカル変数配列を既に取得していると仮定して)