阅读更多

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")....意思差不多吧

你的确愚昧

发表评论

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

相关推荐

  • 表达式引擎fel-0.9版本

    Fel表达式计算引擎0.9版本

  • Fel Javael表达式引擎

    Fel轻量级的高效的表达式计算引擎。 Fel在源自于企业项目,设计目标是为了不断变化的功能需求和性能需求.文档中有个别错误,但不影响阅读

  • java 表达式引擎 效率最高_性能可以媲美Java的表达式引擎:Fel 0.7.1发布

    简 介Fel(Fast Expression Language)是开放的、高效的、轻量级的表达式语言。拥有解释执行和编译执行双引擎。Fel在编译执行时,做了很多优化,适合处理海量数据。Fel扩展性强,用户可以定制Fel执行时的众多环节,以...

  • 史上最为高效的表达式计算引擎Fel

     通常情况下,Fel-0.7每秒可以执行千万次表达式(不包含编译时间)。速度是Jexl-2.0的20倍以上。 目前还没有发现开源的表达式引擎比Fel快。 为何要使用Fel ? Fel语法和API非常简单,语法与Java基本相同,几乎没有...

  • Fel表达式引擎

    Fel表达式引擎

  • 性能可以媲美Java的表达式引擎——Fel 0.7.1 发布

    介绍在这里:http://code.google.com/p/fast-el/ 表达式很清晰,性能可以自己测试。

  • bpi-fel-mass-storage-gui4win:带有 sunxi-tools 的 bpi-fel-mass-storage GUI 以便在 windows 下运行

    bpi-fel-mass-storage-gui4win 带有 sunxi-tools 的 bpi-fel-mass-storage 图形用户界面,以便在 Windows 下运行。支持的设备: BPI-M2 +(H2 + / H3 / H5) BPI-M2Zero (H2+) BPI-M3 (A83T/H8/R58) BPI-M64 (A64/...

  • fel计算引擎0.9官方版本.zip

    fel计算引擎0.9官方版本,0.9的版本多了很多方法,支持了大数高精度,maven没有找到直接pom依赖,下载到本地再依赖本地jar包来进行操作

  • sunxi-tools-fel-windows

    我自己移植的windows下的sunxitools-fel,可以用于全志cpu的fel模式。cpu调试

  • bpi-fel-mass-storage-gui4win v1.002

    本工具用于Windows将开发板的emmc识别为U盘,然后进行系统烧录

  • Fel表达式引擎使用样例-验证逻辑表达式是否规范

    public static void main(String[] args){ ... //表达式转换 String[] exp=keyExp.replace(&quot; and &quot;,&quot;&amp;amp;&amp;amp;&quot;).replace(&quot; or &quot;,&quot;||&quot;).replaceAll(&quot;^not

  • 高速 Fel表达式引擎

    高速 Fel表达式引擎 。类似ognl 速度很快。 性能很高

  • fel计算引擎(表达式计算数学公式)--实例sigma求和∑

    fel计算引擎--实例sigma求和∑ 从而避免每一个公式都手动写方法计算,只要输入数学公式就可计算结果; 示例计算 1+2*(SUM('x_*3+1','1','5')+1) fel用的0.9版本,支持大数高精度; 约定变量以下划线结尾 ...

  • fel-0.8.zip

    fel轻量高效的表达式计算引擎,下载后解压放入项目中即可使用

  • java fel api_Java表达式计算-Fel

    Fel是支持表达式计算的一个库(java)。Fel支持解释执行和编译执行,可以根据性能要求选择执行方式。下面给出示例和性能测试数据:package datagene;import java.util.Random;import com.greenpineyu.fel.Expression;...

  • FEL-表达式

    Fel是轻量级的高效的表达式计算引擎[Z] Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求。 Fel是开放的,引擎执行中的多个模块都可以扩展或替换。Fel的执行主要是通过函数实现,...

  • Python项目-实例-02 代码雨.zip

    Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

  • Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络-支持向量机的多输入单输出回归预测(含完整的程序,GUI设计和代码详解)

    内容概要:本文介绍了使用 Matlab 实现 SO-CNN-SVM 框架进行多输入单输出回归预测的全过程。该框架利用蛇群优化算法(SO)优化卷积神经网络(CNN)和 支持向量机(SVM),实现高效的特征提取和回归预测。文章详细描述了数据预处理、模型构建、SO算法优化、模型训练、可视化和 GUI 设计的步骤,并提供了完整的代码示例。 适合人群:具备一定机器学习和深度学习基础,熟悉 Matlab 编程的研究人员和开发人员。 使用场景及目标:① 工业制造中的设备故障预测和质量控制;② 金融分析中的市场价格预测和风险管理;③ 环境监测中的气候变化和空气质量预测。该框架的目标是提高预测精度,优化模型参数,缩短训练时间,增强模型泛化能力。 阅读建议:本文不仅详细介绍了理论背景和技术细节,还提供了实际操作的代码和 GUI 设计思路,建议读者在阅读过程中结合实际数据和代码进行实验,以更好地理解和掌握相关技术。

  • Java系统源码+社区养老服务系统

    Java系统源码+社区养老服务系统 内容概要: 本资源包含了完整的Java前后端源码及说明文档,适用于想要快速搭建并部署Java Web应用程序的开发者、学习者。 技术栈: 后端:Java生态系统,包含Spring Boot、Shiro、MyBatis等,数据库使用Mysql 前端:Vue、Bootstrap、Jquery等 适用场景示例: 1、毕业生希望快速启动一个新的Java Web应用程序。 2、团队寻找一个稳定的模板来加速产品开发周期。 3、教育机构或个人学习者用于教学目的或自学练习。 4、创业公司需要一个可以立即投入使用的MVP(最小可行产品)。

Global site tag (gtag.js) - Google Analytics