0

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ベンチマークは、セッターを呼び出すことで値が変更される多くのループを実行します。

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

ありがとう、オリバー

4

2 に答える 2

1

インボークダイナミックの主な高速化は、ある種のダックタイピングを使用する場合だと思います。

invokedynamic API は、JVM で動的メソッド ディスパッチを使用する言語用に作成されています。Groovy は確かにその 1 つです。ただし、動的ディスパッチを使用するメソッドを使用する場合にのみ、indy を使用できます。必要に応じて例を挙げます。

しかし、Groovy の indy ディスパッチ機能を分析したところ、古い動的ディスパッチ関数がメソッドハンドルにパックされているだけのようです。実際、本当にそうなれば、これ以上速くなることはありません。私の認識では、invokedynamic の Groovy 実装は現時点では最適化されていません。

于 2013-02-25T15:31:21.297 に答える
0

簡単な答え: カテゴリを使用します。コードを使用するとコードが大幅に遅くなる場合は、indy を使用していません。

より長い答え: コードをどこかに投稿できれば、私はそれを分析できます

于 2013-03-07T09:39:15.570 に答える