2016-08-12 26 views
0

私は、多くの並列実行(スレッドプール、Java 8ストリームなど)を使用する大きなJavaフレームワークを持っています。純粋なJavaでそれを使用しているときにフィンが機能し、多量の計算作業で最大8つのコアがすべてロードされます。groovyからjavaを呼び出す際の並列性の問題

私はJavaクラスのために薄いGroovyラッパーを作って構成を簡素化しました。私が期待しているのは、Groovy呼び出しでわずかなパフォーマンスオーバーヘッドが発生することですが、コンパイルされたJavaクラスはまったく同じように動作するはずです。実際には、パフォーマンスが大幅に低下しており、プログラムでは1〜2つのコアを40〜50%しか使用していないことがわかります。 GroovyコードをGroovyShellにラップしてJavaメインクラスから呼び出すと、すべて正常に動作し、100%パフォーマンスが戻ってきます。

何が問題ですか? Groovyランチャーは、デフォルトのスレッドプーリング設定をオーバーライドしますか?

私はJava 8、Groovy 2.4.7を使用していて、IdeaのGroovyスクリプトを呼び出しています。

答えて

0

問題が見つかりました。 Javaスレッドプールではありません。Groovyshellです。私はGroovyShell私のJavaコード内でコールするので、私はそれはうまく動作しますが、Javaから呼び出すときGroovyから呼び出すとき、現在のスレッドが別のスレッドで終了するGroovyShell呼び出しを待つ原因異なるシェルオブジェクト)。

同期解析スクリプトキャッシング(スクリプトは一度解析され、別のバインディングで使用されます)が含まれており、このコード部分のパフォーマンスが大幅に改善されています。

唯一の問題は、スクリプトを複製して別のスレッド用に配布する明白な方法がないので、呼び出しを同期させる必要があるということです。

関連する問題