2017-04-26 136 views
-2

示例程序犀牛JS的eval比犀牛JS

ScriptEngineManager mgr = new ScriptEngineManager(); 
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript"); 
System.out.println(jsEngine.eval("a>10 || b<10 || c=10")); 

在我的節目我用上面的代碼來計算表達式的1000年,它使用JavaScript函數一樣的indexOf(),更換日期函數和許多慢得多more.This類型的表達式曾被評估在犀牛(當平臺Java版本是Java 7)比nashorn速度更快....我應該說至少15〜20倍更快....

使用rhino與Java 8似乎是一個乏味的工作...可以有人建議的解決方法,使其更快...

+0

你如何測量速度?你有一些實際比較執行時間的示例代碼嗎? – pvg

+0

解決方法:實現您自己的解析器?他們似乎是簡單的邏輯表達。 – markspace

+0

@markspace我剛剛給了簡單表達式的例子,但我們正在使用如此多的javascript函數,如indexof(),替換,日期和很多...我將更新問題 – Hadooplearner

回答

2

Rhino有一個解釋器,Nashorn將每個表達式編譯成JVM字節碼,然後在內部加載並運行如此生成的JVM類。因此除了解析之外,每個eval都會產生字節碼生成和JVM類加載成本。

你可以做的一件事是將腳本引擎強制轉換爲Compilable,並用它來創建CompiledScript以進行重複調用。

如果您有很多經過一次評估的表達式,這將無濟於事,但它對經常評估的表達式有幫助。

+0

感謝您的答案,它的工作非常出色在這種變化之後,性能有了很大提高 – Hadooplearner