12

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

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

私が最初に考えたのは、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);

フィードバックをいただければ幸いです。

4

1 に答える 1

12

最も可能性の高い問題は、eval()が呼び出されるたびにエンジンが実際にスクリプトを評価することです。代わりに、コンパイル可能なインターフェイスを介してプリコンパイルされたスクリプトを再利用できます。

    // 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、スクリプトが変更された場合は、ファイルのタイムスタンプチェックを実装することもできます。コンパイル(..)を再度呼び出します。

于 2012-08-31T20:02:15.273 に答える