2014-02-06 61 views
0

我們使用Rhino引擎在我們的javaEE應用程序中評估javascript(我們使用javascript作爲參數化,在DTO -s之間傳遞數據以及條件參數化等)。 我們做了一些性能測試,結果很奇怪。在多線程java應用程序中的javascript評估

javascript引擎非常慢。持續時間呈指數增長。 我想將整個引擎改爲納什龍,但在此之前我試圖改進我們現在擁有的東西。

關於我們使用它的方式有些代碼片段(也許問題就在這裏()?) 每次我試圖評估我創建了一個JavaScriptEval表達對象是這樣的:

public void init() { 

    Context cc = Context.getCurrentContext(); 
    if (cc == null) { 
     cc = Context.enter(); 
    } 
    this.ctx = cc; 
    this.scope =this.ctx.initStandardObjects(null); 
    this.wrapFactory = new WrapFactory(); 
} 

,我們之後添加對象 - 例如DTO -S-的範圍

private void putObject(String id, Object obj) { 

    Context ctx = setupContext(); 
    if (obj != null) { 
     Scriptable paramWrapper = this.wrapFactory.wrapAsJavaObject(/*this.ctx*/ ctx, this.scope, obj, obj.getClass()); 
     this.scope.put(id, this.scope, paramWrapper); 
    } 
} 

之後,我們評估我們的表現是這樣的:

public Object eval(Object scriptId, String source){ 
    Object ret; 
    ret = ctx.evaluateString(this.scope,source, scriptId.toString(), 1, null); 
    return ret; 
} 

我試過使用某種緩存。我使用了compileString方法,然後將其放入緩存中。但是這種方式的內存使用率非常高。

之後,我嘗試限制我放入緩存的javascript源的長度。但問題與增加併發使用情況相同,性能很差。

有什麼想法? 所有建議,歡迎

回答

0

我覺得沒有很好的答案爲:)

但我解決了這個問題: 我預編譯的表達式,如果這是一個簡單的init(類似dto.setA( 1))只需在java代碼中執行它。

另一種方式是使用分離的緩存分離進程,然後將其刪除。

它是解決這個問題的一個非常特殊的方式,但我爲我工作:)