字符串计算引擎
详细说明:功能:给出一个字符串表达式(可以是任意复杂的字符串表达式),计算字符串表达式的值. <br> 特性: <br> 1:用户可以添加其它运算符号 ,也就是说用户可以制定新的运算符,引擎中不存在的运算符号,当然具体的运算类还是得用户提供. <br> 2: 可以修改运算符的性质,你可以使得3*3=6,只要将*的运算类指向expression.DAdd就可以了,具体如何操作,ReadMe中有说明.<br> 3:可以使操作符运算具有多种形态。您即可以用“+”表示加法运算,也可以用" 加法" 表示加法运算.<br> 强调一下:,本引擎的最大特点就是: 用户可以添加自己的运算符号,而无需修改计算引擎本身.<br> -function : given a string expression (which may be arbitrary complex string expression), and calculating the value of the string expression. Lt; Brgt; Characteristics : lt; Brgt; A : Users can add other computing symbols This means users can develop new Operators the engine does not exist arithmetic symbols, of course, the specific type of operation must also be available. lt; brgt; 2 : Operators can modify the nature, you can make 3* 3 = 6, as long as the computing category* expression.DAdd can point to a specific example Dr operation, ReadMe is described. lt; brgt; 3 : It will make operation Operator with a variety of patterns. That is, you can use "," said Ghaffar Operators can also use quot quot said Ghaffar addition operations. Lt; Brgt; Stress : The engine is the biggest
表达式计算引擎 Fel-0.5 版本发布
Fel是轻量级的高效的表达式计算引擎。
Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求。
Fel是开放的,引擎执行中的多个模块都可以扩展或替换。Fel的执行主要是通过函数实现,运算符(+、-等都是Fel函数),所有这些函数都是可以替换的,扩展函数也非常简单。
Fel有双引擎,同时支持解释执行和编译执行。可以根据性能要求选择执行方式。编译执行就是将表达式编译成字节码(生成java代码和编译模块都是可以扩展和替换的)
Fel基于Java1.5开发,适用于Java1.5及以上版本。
特点:
易用性:API使用简单,语法简洁,和java语法很相似。
轻量级:整个包只有300多KB。
高 效:目前没有发现有开源的表达式引擎比Fel快。
扩展性:采用模块化设计,可灵活控制表达式的执行过程。
根函数:Fel支持根函数,“$('Math')”在Fel中是常用的使用函数的方式。
$函数:通过$函数,Fel可以方便的调用工具类或对象的方法(并不需要任何附加代码),具体请看示例。
不足:
支持脚本:否。
支持数组:否。Fel不支持类似于array[i]这样的语法,可以通过其他方法获取数据值。后续版本可以改进。
支持三元表达式:否。后续版本可以改进(0.5版本已经支持三元表达式)。
适应场景:
Fel适合处理海量数据,Fel良好的扩展性可以更好的帮助用户处理数据。
Fel同样适用于其他需要使用表达式引擎的地方(如果工作流、公式计算、数据有效性校验等等)
Fel使用例子:
1 FelEngine fel = new FelEngineImpl();
2 Object result = fel.eval("5000*12+7500");
3 System.out.println(result);
输出结果:67500
0.5版本改进
1:加入三元表达式
2:调整||和&&的优先级,保持与java语法的一致性。
3:加入!操作符
4:加入"$"函数,通过是"$"函数可以直接调用工具类的方法(eg:$('Math').min(1,2)相当于Math.min(1,2);
更多内容
项目地址:le/p/fast-el/
下 载:lecode/files/fel-all-0.5.jar
文 档:lecode/files/Fel%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%BC%95%E6%93%8E.doc
性能测试:le/p/fast-el/wiki/Performance
介绍
选用Jexl作为比较对象是对不住Jexl了。在Fel出现之前,使用的是Jexl,对它还是有感情的。
Jexl毕竟没有将表达式编译成字节码,所以效率不是非常高,对比测试也有失公平。
当然,Fel在性能上并不是专软柿子比较。
目前还没有发现开源的EL比Fel快。如果有,请告诉我,我也学习一下。
备注:以下所有测试中的时间统计都没有包含编译时间。
软硬件环境
操作系统 Microsoft Windows 7 Home Basic SP1 64bit
CPU Intel(R) Core(TM) i3-2310M CPU@2.10GHz
内存 4G ddr3-1333
JDK java version "1.6.0_26"
Fel 0.5
Jexl 2.0.1
变量
Map<String, Object> vars = new HashMap<String, Object>();
vars.put("i", 100);
vars.put("pi", 3.14d);
vars.put("d", -3.9);
vars.put("b", (byte) 4);
vars.put("bool", false);
Map<String,Object> m = new HashMap<String, Object>();
m.put("d", 5);
m.put(null,"this is null");
vars.put("m", m);
vars.put("s","hello world");
场景1:常量计算
表达式:
1000+100.0*99-(600-3*15)%(((68-9)-3)*2-100)+10000%7*71
执行结果:11181.0
EL 速度(ms)
fel 30
jexl 45098
场景2:包含多个变量的布尔表达式
表达式:
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
执行结果:true
EL 速度(ms)
fel 880
jexl 36733
场景3:包含多个变量的算术表达式
表达式:
pi*d+b-(1000-d*b/pi)/(pi+99-i*d)-i*pi*d/b
执行结果:295.86196287059323
EL 速度(ms)
fel 613
jexl 16907
场景4:调用JAVA方法
表达式:
s.substring(m.d)
执行结果: world
EL 速度(ms)
fel 398
jexl 8204
场景5:嵌套调用JAVA方法
表达式:
s.substring(1).substring(2).indexOf('world')
执行结果:
3
EL 速度(ms)
fel 446
jexl 7189
测试结论:字符串长度计算工具下载
常量表达式:比Jexl快得太多了,主要是Fel对常量表达式作了优化。
包含多个变量的表达式:Fel比Jexl快20以上。Fel同样对变量访问作了优化。
字符串访问:Fel快了近20倍。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论