2016-05-24 10 views
1

私はGroovy スイッチを私のアプリケーションで(非常に)頻繁に呼びます。 VisualVMのサンプリングは、私はScriptBytecodeAdapter.isCase()に自分のアプリケーションの時間の約20%を費やしていることを示しています。Groovyに標準のJavaスイッチを使用させますか?

すべての場合は文字列であるので、私の使用量は、より効率的であるべき標準的なJava 7 string switchによりサポートされるだろう。

は、標準のJavaスイッチにフォールバックするGroovyのを聞いて、それは可能ですか?

備考:

  • Iは(SEMANTIC_ANALYSISにおけるASTことによってそれ自身が生成されるスイッチ)AST Sを使用することができます。

  • やGroovyのCompileStatic変換での適用地図クロージャ

+0

他の実装オプションを試して、違いがあるかどうかを確認しましたか?それらが助けにならない場合は、あなたのASTトランスフォーマにCompileStatic変換を適用してみてください(あなたのコードを前提としています)。それを超えて、Javaでそのクラスを書くことができるのでしょうか? – cjstehno

+0

私はこれらの他の実装を試していません(私は、java 7スイッチがオプションではない場合のみ)。私はASTにCompileStaticアノテーションを追加しますが、実際に考慮されているかどうかは確認していません。 –

+0

あなたは厳しい状況にあります。はい、標準のJavaに変換することでパフォーマンスを向上させることができますが、残念ながら、この言語が常に基盤となるJavaへの直接的なパスを与えるわけではありません。がんばろう。また、CompileStaticを生成されたコードにプログラムで適用し、アノテーションとしてトランスフォーマ自体に追加するのではなく、必ず適用してください。 ;-) – cjstehno

答えて

1

(私は通常< 20例を持っている)他の実装オプションではなく場合、S /他 Sを使用することができあなたのASTは、ノードを構築した後に、生成されたコードを静的にコンパイルする必要があります。注釈を変換クラスに追加するのではなく、コード内でプログラムでこれを実行していることを確認してください。

ほとんどの場合、コード構築物の、昔ながらのJavaバージョンが追加Groovyの構文よりもパフォーマンスになります。しかし、場合によっては、基礎となるJava構造にアクセスすることが難しい場合があります。

これは、少なくとも1つのステップ遠くそれを取る必要があります。

+0

残念ながら、CompileStaticを適用すると、いくつかのcallXXX呼び出しが削除されたので便利でしたが、生成されたバイトコードは強力なJava 7スイッチではなくisCase呼び出しを使用します:-( –

+0

私はASTをリファクタリングしましたif/elseステートメントを使用してください(switch/caseは使用しないでください)。テーブルスイッチを生成するのが最善でしたが、通常は10-20未満のケースしかないので、/ elseは十分に効率的です。 –

関連する問題