阅读更多

28顶
0踩

开源软件
简介
Fel(Fast Expression Language)是开放的、高效的、轻量级的表达式语言。拥有解释执行和编译执行双引擎。Fel在编译执行时,做了很多优化,适合处理海量数据。Fel扩展性强,用户可以定制Fel执行时的众多环节,以满足需求。Fel学习门槛非常低,基本上可以做到拿来即用,即使是二次开发,也非常简单。Fel基于Java1.5开发,适用于Java1.5及以上版本。

示例
FelEngine fel = new FelEngineImpl();
FelContext ctx = fel.getContext(); 
ctx.set("单价", 5000); 
ctx.set("数量", 12); 
ctx.set("运费", 7500); 
Object result = fel.eval("单价*数量+运费"); 
System.out.println(result);

输出结果:67500

更多内容请参考
项目地址:http://code.google.com/p/fast-el/
讨论贴:http://www.iteye.com/topic/1114021
性能测试:http://code.google.com/p/fast-el/wiki/Performance

备注
Fel还在持续发展中,功能尚不完善,更谈不上完美,但是它的性能及扩展性值得花费几分钟试用。用户越多,动力越足(即使用户不多,也会坚持做下去,因为现在还没有发现有哪个EL完全超越了Fel)。另外,如果有人知道比Fel更快的EL,请告诉我,不胜感激。
28
0
评论 共 37 条 请登录后发表评论
37 楼 lotusyu 2011-09-19 08:46
fjjiaboming 写道
类型转换怎样??
mail : linzuxiong1988@gmail.com

有什么需求请发我邮箱。
36 楼 fjjiaboming 2011-09-18 23:35
类型转换怎样??
mail : linzuxiong1988@gmail.com
35 楼 bcw104 2011-09-17 23:48
bcw104 写道
nick.s.ni 写道
與在Java中使用腳本語言如javascript有什麽區別?感覺差不多。效率就不知道了。
我有在Java中使用腳本語言輸出文件。功能面感覺腳本已經够了

有同感,谁能说一下在java里用javascript脚本和专用表达式引擎的区别。


试了下你的第一个测试项,对jsel, fel, jdk1.6中自带的Rhino脚本引擎进行了对比,初步结果如下:
long start = System.currentTimeMillis();
		ExpressionFactory factory = ExpressionFactory.getInstance();
		Expression el = factory.create("1000+100.0*99-(600-3*15)%(((68-9)-3)*2-100)+10000%7*71");
		Object result1 = el.evaluate();
		System.out.println(result1);
		System.out.println("JSEL耗时:" + (System.currentTimeMillis() - start));
		start = System.currentTimeMillis();

		ScriptEngineManager manager = new ScriptEngineManager();
		ScriptEngine engine = manager.getEngineByName("js");
		

		try {
			Object maxNum = engine.eval("1000+100.0*99-(600-3*15)%(((68-9)-3)*2-100)+10000%7*71");
			System.out.println(maxNum);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("rhino耗时:" + (System.currentTimeMillis() - start));
		start = System.currentTimeMillis();
		
		
		FelEngine fel = new FelEngineImpl();    
		Object result = fel.eval("1000+100.0*99-(600-3*15)%(((68-9)-3)*2-100)+10000%7*71");    
		System.out.println(result); 
		System.out.println("fel耗时:" + (System.currentTimeMillis() - start));
		start = System.currentTimeMillis();

如果:
11181.0
JSEL耗时:83
11181.0
rhino耗时:38
11181
fel耗时:217
34 楼 bcw104 2011-09-17 14:19
nick.s.ni 写道
與在Java中使用腳本語言如javascript有什麽區別?感覺差不多。效率就不知道了。
我有在Java中使用腳本語言輸出文件。功能面感覺腳本已經够了

有同感,谁能说一下在java里用javascript脚本和专用表达式引擎的区别。
33 楼 piaoling 2011-09-17 11:34
真是开源的东西越来越多了,支持
32 楼 dennis_zane 2011-09-17 11:21
明白了,本质上FEL是个"强类型"的EL,例如编译a+b这个表达式,必须首先知道a和b的类型,才能在编译的时候生成正确的代码,是用字符串相加还是用数字相加。编译后,如果a和b的类型改变,则可能运行不了编译后的表达式。

这跟aviator或者jxel还是很不一样的,这两个都是弱类型,在运行时才去判断变量类型并执行适配的操作,而FEL无需在运行时处理类型问题。
31 楼 dennis_zane 2011-09-17 11:09
lotusyu 写道
如果你喜欢Fel请在google code 中给Fel加颗心。
能在短时间内发布0.5版本,需要感谢javamonkey提供的技术支持。如果对模板引擎感兴趣,也可以关注javamonkey的beetl


另外看了下你的代码,你的测试似乎不公平啊。因为你编译的时候已经将Context固定了,也就是变量固定了,其实每次编译出来都是固定的结果了,执行的时候只是取结果,那当然非常快了。
公平的测试应该是每次只编译表达式本身,然后每次执行再传入变量,这才能测试出真实的执行性能吧?
30 楼 eimsteim 2011-09-17 10:44
lotusyu 写道
dennis_zane 写道
呵呵,aviator 2.0估计还是比不过。性能上aviator还有优化的空间,有空会再搞下。但是el的性能我认为并不是那么关键,每秒钟单机几十万甚至百万级别计算的应用,目前还没有遇到过。EL会越来越多样化,专用化,特定于某些应用需求的EL总会存在,体现出作者自己的设计目标,轮子也会不断有人造出来,这是大好事啊。

你说得没错,有些地方对性能没什么要求,比较说工作流路由、用户输入的合法性校验。也
有些地方地方对EL的要求很高。比如说通过EL对表的记录进行条件匹配,计算量很大。El的效率至关重要。如你所说,不同的EL有不同的应用场景,Fel只不过是多了一种选择。
aviator文档还是比较多的,性能也很好。希望aviator有很好的发展。

用户输入合法性校验对性能没要求?
29 楼 lotusyu 2011-09-17 10:36
如果你喜欢Fel请在google code 中给Fel加颗心。
能在短时间内发布0.5版本,需要感谢javamonkey提供的技术支持。如果对模板引擎感兴趣,也可以关注javamonkey的beetl
28 楼 lotusyu 2011-09-17 10:15
Fel0.5 版本已经发布。做了以下改进
1:加入三元表达式
2:调整||和&&的优先级,保持与java语法的一致性。
3:加入!操作符
4:加入"$"函数,通过是"$"函数可以直接调用工具类的方法(eg:$('Math').min(1,2)相当于Math.min(1,2);
27 楼 lotusyu 2011-09-17 10:11
comsci 写道
支持表达式嵌套计算吗? 

这是基本功能
26 楼 lotusyu 2011-09-17 10:10
dennis_zane 写道
呵呵,aviator 2.0估计还是比不过。性能上aviator还有优化的空间,有空会再搞下。但是el的性能我认为并不是那么关键,每秒钟单机几十万甚至百万级别计算的应用,目前还没有遇到过。EL会越来越多样化,专用化,特定于某些应用需求的EL总会存在,体现出作者自己的设计目标,轮子也会不断有人造出来,这是大好事啊。

你说得没错,有些地方对性能没什么要求,比较说工作流路由、用户输入的合法性校验。也
有些地方地方对EL的要求很高。比如说通过EL对表的记录进行条件匹配,计算量很大。El的效率至关重要。如你所说,不同的EL有不同的应用场景,Fel只不过是多了一种选择。
aviator文档还是比较多的,性能也很好。希望aviator有很好的发展。
25 楼 comsci 2011-09-17 10:01
支持表达式嵌套计算吗? 
24 楼 dennis_zane 2011-09-17 01:58
呵呵,aviator 2.0估计还是比不过。性能上aviator还有优化的空间,有空会再搞下。但是el的性能我认为并不是那么关键,每秒钟单机几十万甚至百万级别计算的应用,目前还没有遇到过。EL会越来越多样化,专用化,特定于某些应用需求的EL总会存在,体现出作者自己的设计目标,轮子也会不断有人造出来,这是大好事啊。
23 楼 bowlongcn 2011-09-16 22:39
非常不错坚决支持
22 楼 juniort 2011-09-16 20:48
作者加油,让程序员满意确实不容易呵呵!
21 楼 lotusyu 2011-09-16 20:47
今天抽空实现了三元表达式等功能,然后checkout jindw写的测试代码,测试代码有些问题(Fel出现的编译异常,是由于没有正确使用Context导致的),经过改正后再做了一下测试,结果如下(数值越小越好):

Source:'A' == 'A' || 'B' == 'B' && 'ABCD' == t &&  'A' == 'A'
result:true

Labels: JXEL      JSEL      MVEL      Ognl      Aviator   FEL      
Times: 14.422548 0.469657  3.260236  1.066871  18.100636 0.351877 
Scale: 40.98747  1.3347192 9.265272  3.031943  51.440235 1.0


Source:1000+100.0*99-(600-3*15)%(((68-9)-3)*2-100)+10000%7*71
result:11181

Labels: JXEL      JSEL      MVEL      Ognl      Aviator   FEL      
Times: 193.1466  0.455974  0.597213  0.164698  16.732227 0.046428 
Scale: 4160.132  9.821099  12.863208 3.5473852 360.3909  1.0 


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: JXEL      JSEL      MVEL      Ognl      Aviator   FEL      
Times: 70.39343  0.702776  6.138294  0.3812    13.452444 0.049849 
Scale: 1412.1333 14.098096 123.13776 7.6470942 269.86386 1.0


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: JXEL      JSEL      MVEL      Ognl      Aviator   FEL      
Times: 66.77692  80.50451  630.2782  2147.4836 135.19154 1.860059 
Scale: 35.900433 43.280624 338.8485  1154.5245 72.68131  1.0 


Source:i * pi
result:314.0000104904175

Labels: JXEL      JSEL      MVEL      Ognl      Aviator   FEL      
Times: 2.280357  1.144577  13.597592 0.744806  12.63433  0.74725  
Scale: 3.0616791 1.5367452 18.256556 1.0       16.96325  1.0032814


Source:thiz.add(1,3)
result:4

Labels: JXEL      JSEL      MVEL      Ognl      Aviator   FEL      
Times: 25.700687 20.073105 46.815735 1.44465   2147.4836 0.295674 
Scale: 86.92238  67.88931  158.33565 4.8859553 7263.011  1.0 


备注:这个测试对于Aviator是不公平的,因为没有使用Aviator2.0。其他包没有太关注。现在正在开发新的功能,没有时间做详细测试,在家里还是感谢jindw提供的测试代码

小结:经过上面的测试,Fel全面领先。
20 楼 rabbitpro 2011-09-16 15:15
现在的表达式解析器有很多,我现在项目中正好用到,选用了spel.
19 楼 elam 2011-09-16 11:05
相比BeanShell有什么优势?
18 楼 willothe 2011-09-16 08:57
ansjsun 写道
lotusyu 写道
ansjsun 写道
和直接构造实体类有区别么..具体应用场景在什么地方啊??效率要比hashmap高很多么

表达式是动态的,一般由用户创建,或由程序自动生成,不能硬编码的。
可以应用在数据过滤、条件匹配、公式求值、工作流路由等。现在很多的开源框也会用到EL,总之,凡是支持用户写表达式的地方,都可以使用EL。
至于效率,不知道你为何拿HashMap做比较?


我愚昧了..我很少...有这种需求的..不过我感觉比如用户在前台输入
"A+B*C" 字符串传到后台..然后我根据运算符分割..然后算出来HashMap.get("A")+HashMap.get("B")*HashMap.get("C")....意思差不多吧

你的确愚昧

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

Global site tag (gtag.js) - Google Analytics