2012-08-31 11 views
10

私のアプリケーションでScriptEngineを使用して、アプリケーション内のクライアントコードを評価しています。 問題はパフォーマンスが十分ではなく、実行時間を改善するための対策を講じる必要があります。 現在、基本的にURLのパラメータ置換である非常に簡単なスクリプトを評価するには、最大1463ms(平均で約300ms)かかることがあります。Java ScriptEngine(Groovy)では、パフォーマンスを向上させる方法は?

私はこのパフォーマンスを向上させる簡単な戦略を、スクリプト作成能力を失うことなく探しています。

私は、最初にScriptEngineオブジェクトをプールして再利用すると考えました。私はそれが再利用されることを意図しているが、実際にそれをやっている人の例は見つけていません。

アイデア?すべてのフィードバックをいただければ幸いです

ScriptEngineManager factory = new ScriptEngineManager(); 
GroovyScriptEngineImpl engine = (GroovyScriptEngineImpl)factory.getEngineByName("groovy"); 
engine.put("state", state; 
engine.put("zipcode", zip); 
engine.put("url", locationAwareAd.getLocationData().getGeneratedUrl()); 
url = (String) engine.eval(urlGeneratorScript); 

: はここに私のコードです!

答えて

12

おそらく問題は、エンジンが実際にeval()が呼び出されるたびにスクリプトを評価することです。代わりに、Compilableインターフェイス経由でプリコンパイルされたスクリプトを再利用することができます。

// move this into initialization part so that you do not call this every time. 
    ScriptEngineManager manager = new ScriptEngineManager(); 
    ScriptEngine engine = manager.getEngineByName("groovy"); 
    CompiledScript script = ((Compilable) engine).compile(urlGeneratorScript); 

    //the code below will use the precompiled script code 
    Bindings bindings = new Bindings(); 
    bindings.put("state", state; 
    bindings.put("zipcode", zip); 
    bindings.put("url", locationAwareAd.getLocationData().getGeneratedUrl()); 
    url = script.eval(bindings); 

FWIWスクリプトを再度呼び出し、コンパイル(..)を変更した場合、あなたはまた、ファイルのタイムスタンプチェックを実装することができます。

+0

これは素晴らしいアイデアです!私は先に進み、コモンズプールでScriptEngineをプールしました。私は今すぐ先に進み、プリコンパイルします。ありがとう! – matsientst

関連する問題