2012-08-31 2 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

관련 문제