论坛首页 Java企业应用论坛

表达式引擎JSEL介绍

浏览 18689 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (7)
作者 正文
   发表时间:2010-08-15   最后修改:2010-08-15
olivechinese 写道
周未用了下
JSEL
发现JSEL对 纯 数学运算 在同类产品中,效率是最高的,
但是在 对象运算中如,  'A' == 'A' || 'B' == 'B' && 'ABCD' == ABCD &&  'A' == 'A' 或其他自定义对象中,效率要比JEXL要低,
希望能改进这方面的算法


非常感谢你的关注,更重要的是,你这个测试让我发现了一个bug,运算符优先级的问题: 运算符二级优先级判断错误 

这个问题已经在今天中午发布的2.0A4中修复。

修复这个问题后,我这边的测试数据是:
---------------------
Source:'A' == 'A' || 'B' == 'B' && 'ABCD' == t &&  'A' == 'A' (result=true)
Labels:		MVEL      		Ognl      		Aviator   		JXEL      		JSEL      
Times:		3.019352  		0.985064  		11.102609 		11.200559 		0.531242  
Scale:		5.683572  		1.854266  		20.899343 		21.083723 		1.0       
---------------------
Source:1000+100.0*99-(600-3*15)%(((68-9)-3)*2-100)+10000%7*71(result=11181.0)
Labels:		MVEL      		Ognl      		Aviator   		JXEL      		JSEL      
Times:		0.307111  		0.172375  		10.650497 		44.61275  		0.507288  
Scale:		1.7816447 		1.0       		61.786785 		258.8122  		2.9429326 
---------------------
测试结果不一致:MVEL=-7,Ognl=1
测试结果类型不一致:result=1,Ognl=class java.lang.Integer,Aviator=class java.lang.Long
测试结果类型不一致:result=1,Aviator=class java.lang.Long,JXEL=class java.lang.Integer
测试结果类型不一致:result=1,JXEL=class java.lang.Integer,JSEL=class java.lang.Long
Source:6.7-100>39.6 ? 5==5? 4+5:6-1 : !(100%3-39.0<27) ? 8*2-199: 100%3(result=1)
Labels:		MVEL      		Ognl      		Aviator   		JXEL      		JSEL      
Times:		5.123787  		0.164249  		4.438563  		12.610787 		0.110355  
Scale:		46.43004  		1.4883693 		40.220768 		114.27472 		1.0       
---------------------
表达式测试异常:Ognljavassist.CannotCompileException: [source error] ) is missing
测试结果不一致:MVEL=true,Ognl=null
测试结果不一致:Ognl=null,Aviator=true
Source:i * pi + (d * b - 199) / (1 - d * pi) - (2 + 100 - i / pi) % 99 ==i * pi + (d * b - 199) / (1 - d * pi) - (2 + 100 - i / pi) % 99(result=true)
Labels:		MVEL      		Ognl      		Aviator   		JXEL      		JSEL      
Times:		234.21127 		2147.4836 		61.84004  		14.983838 		8.319792  
Scale:		28.151098 		258.11746 		7.432883  		1.8009871 		1.0       
---------------------
测试结果不一致:MVEL=314.0000104904175,Ognl=314.0
测试结果不一致:Ognl=314.0,Aviator=314.0000104904175
测试结果不一致:Aviator=314.0000104904175,JXEL=314.0
测试结果类型不一致:result=314.0,JXEL=class java.lang.Double,JSEL=class java.lang.Float
Source:i * pi(result=314.0)
Labels:		MVEL      		Ognl      		Aviator   		JXEL      		JSEL      
Times:		5.42876   		0.374265  		2.375617  		0.92347   		0.844769  
Scale:		14.505123 		1.0       		6.3474197 		2.4674227 		2.2571414 
---------------------
测试结果类型不一致:result=1,Ognl=class java.lang.Integer,Aviator=class java.lang.Long
测试结果类型不一致:result=1,Aviator=class java.lang.Long,JXEL=class java.lang.Integer
测试结果类型不一致:result=1,JXEL=class java.lang.Integer,JSEL=class java.lang.Long
Source:1(result=1)
Labels:		MVEL      		Ognl      		Aviator   		JXEL      		JSEL      
Times:		0.122759  		0.14885   		1.7152    		0.039351  		0.053039  
Scale:		3.1195903 		3.782623  		43.587204 		1.0       		1.3478438 
---------------------
表达式测试异常:Aviatorcom.googlecode.aviator.exception.ExpressionRuntimeException: Execute expression error
测试结果不一致:Ognl=4,Aviator=null
测试结果不一致:Aviator=null,JXEL=4
Source:thiz.add(1,3)(result=4)
Labels:		MVEL      		Ognl      		Aviator   		JXEL      		JSEL      
Times:		43.03785  		1.216466  		2147.4836 		16.89494  		13.938891 
Scale:		35.37941  		1.0       		1765.3462 		13.888543 		11.458512 
0 请登录后投票
   发表时间:2011-03-11  
MVEL的官方例子里面好像只支持Integer和String两种类型的参数.想问下你用MVEL测试上面运算式时是怎么通过的.

测试代码:
Map<String, Double> test = new HashMap<String, Double>();
test.put("a", new Double(9.3));
test.put("b", new Double(3.7));
String result = (String)MVEL.eval("a * b", test);

输出的异常:
Exception in thread "main" java.lang.ClassCastException: java.lang.Double
at test.Test.main(Test.java:19)
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics