最近項目需要用到配置表達式,然後後臺解析表達式並運行得到結果,類似這種"true||true"表達式,java裏自帶的不支持這種,只能用java裏的ScriptEngine的js引擎來執行,但是效率太慢了,跑個400萬數據要幾十天,太慢了,後來優化了一下也要4天,雖然快了10倍左右,但還是達不到項目要求。
String expression="true||true";
ScriptEngine s = new ScriptEngineManager().getEngineByName("js");
isPassFlag = (boolean) s.eval(expression);//運行表達式得到值
看了看代碼也實在看不出哪裏還可以優化了,想想只能換個能運行表達式的類庫或者jar包,果然找到了其他的一些,如
IKExpression和Apache 的Jakarta Commons Jexl,前者因爲在maven工程裏找不到jar包,我先試了下後面的jexl,感覺速度和js引擎來執行 表達式速度沒快多少。 JexlContext jexlContext = JexlHelper.createContext(); Expression expression1 = ExpressionFactory.createExpression(expression); isPassFlag = (boolean) expression1.evaluate(jexlContext); 只能忍着用導入本地jar包的方式把IKExpression導入到工程,試了下速度,400萬大概8小時,比js的快10多倍。 這下可以了,哈哈 isPassFlag = (boolean) ExpressionEvaluator.evaluate(expression); pom.xml中加入: <dependency> <groupId>org.wltea.expression</groupId> <artifactId>IKExpression</artifactId> <version>2.1.2s</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/IKExpression2.1.2.jar</systemPath> </dependency> ikexpression下載:https://code.google.com/archive/p/ik-expression/downloads 官網:https://code.google.com/archive/p/ik-expression/