阅读更多

9顶
3踩

开源软件
Fel是轻量级的高效的表达式计算引擎。

Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求。

Fel是开放的,引擎执行中的多个模块都可以扩展或替换。Fel的执行主要是通过函数实现,运算符(+、-等都是Fel函数),所有这些函数都是可以替换的,扩展函数也非常简单。

Fel有双引擎,同时支持解释执行和编译执行。可以根据性能要求选择执行方式。编译执行就是将表达式编译成字节码(生成java代码和编译模块都是可以扩展和替换的)
Fel基于Java1.5开发,适用于Java1.5及以上版本。

Fel有多快?

通常情况下,Fel-0.7.1每秒可以执行千万次表达式。速度是Jexl-2.0的20倍以上。
性能可与Java媲美。

目前还没有发现开源的表达式引擎比Fel快。

具体的测试数据请参见:http://code.google.com/p/fast-el/wiki/Performance

为何要使用Fel?

  • Fel语法和API非常简单,语法与Java基本相同,几乎没有学习成本。
  • Fel非常快,上面已经做了简单说明。
  • Fel整个包只有300多KB。
  • Fel可以非常方便的访问数组、集合、Map的元素和对象的属性。
  • Fel可以非常方便的调用对象的方法和类方法(如果这些还不够,可以添加自定义函数)。
  • 扩展Fel非常容易,扩展和修改Fel都非常简单。
项目主页:http://code.google.com/p/fast-el/

下载Fel:http://fast-el.googlecode.com/files/fel-all-0.7.1.jar

备注:附件为性能测试类。

欢迎交流!

9
3
评论 共 35 条 请登录后发表评论
35 楼 u013489005 2015-08-10 23:28
请问,
Exception in thread "main" java.lang.IllegalStateException: Cannot find the system Java compiler. Check that your class path includes tools.jar
at com.greenpineyu.fel.compile.FelCompiler16.<init>(Unknown Source)

新手出现如此的错误如何解决。

请问,
fel会涉及到jvm的安全性问题么?

谢谢回答。

联系邮箱:
frankgray@seekwillfind.org
34 楼 lotusyu 2012-11-14 17:00
kingj 写道
如下表达式,
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; 

循环执行2亿次的结果如下:
Using MVEL ,cost time -->33672 毫秒
===================================
Using JDK ,cost time -->5094  毫秒
===================================
Using Fel ,cost time ->10375  毫秒
可以看到,mvel在执行表达式时效率远不及fel和jdk,
fel的效率是jdk的1/2


你有这样的测试结果可以理解。你写的代码,pi、d都是局部变量吧。而fel在执行时获取变量要从map中读取的。访问局部变量肯定比访问map要快得多,这是不是有失公平?
33 楼 lotusyu 2012-11-14 16:57
kingj 写道
测试了一下,fel的执行效率非常高效,但是其可用性极低,只支持简单的表达式,
不支持分号这种最基本的语法,严格来讲不算是一种脚本语言。

对于业务系统而言,建议试用mvel脚本语言,它完全支持各种语法,java的兼容性非常高。

对于数学计算而言,建议采用fel


请问表达式引擎支持什么样的功能才算得上可用性高?
32 楼 kingj 2012-11-13 10:43
如下表达式,
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; 

循环执行2亿次的结果如下:
Using MVEL ,cost time -->33672 毫秒
===================================
Using JDK ,cost time -->5094  毫秒
===================================
Using Fel ,cost time ->10375  毫秒
可以看到,mvel在执行表达式时效率远不及fel和jdk,
fel的效率是jdk的1/2
31 楼 kingj 2012-11-13 10:41
测试了一下,fel的执行效率非常高效,但是其可用性极低,只支持简单的表达式,
不支持分号这种最基本的语法,严格来讲不算是一种脚本语言。

对于业务系统而言,建议试用mvel脚本语言,它完全支持各种语法,java的兼容性非常高。

对于数学计算而言,建议采用fel
30 楼 founder 2012-10-12 10:11
Fel Maven的GroupId是什么?
29 楼 lotusyu 2012-04-09 15:23
form_rr 写道
public static void main(String[] args) {
long l1 = System.nanoTime();
FelEngine fel = new FelEngineImpl();
Object result = null;
// FelContext ctx = fel.getContext();   ctx.set("单价", 5000);   ctx.set("数量", 12);   ctx.set("运费", 7500);
// Expression exp = fel.compile("单价*数量+运费",ctx);
for (int i = 0; i < 100000; i++) {
result = fel.eval("5000*12+7500");
// result = exp.eval(ctx);
}
long l2 = System.nanoTime();
System.out.println( (l2-l1)/1000000f + "ms" );
System.out.println( result );
}
// 结果:解释运行4550ms,编译运行:619ms。

我们当前项目内的解释器,同样执行"5000*12+7500"。
解释运行216ms,编译运行:正在开发!
不知道秒内千万次的速度如何得出的?


很抱歉引起了你的误解,我做的时间统计是不包含编译时间的。既然你也在开发EL,非常欢迎你加入EL群(75055831)交流。
28 楼 form_rr 2012-04-08 19:34
public static void main(String[] args) {
long l1 = System.nanoTime();
FelEngine fel = new FelEngineImpl();
Object result = null;
// FelContext ctx = fel.getContext();   ctx.set("单价", 5000);   ctx.set("数量", 12);   ctx.set("运费", 7500);
// Expression exp = fel.compile("单价*数量+运费",ctx);
for (int i = 0; i < 100000; i++) {
result = fel.eval("5000*12+7500");
// result = exp.eval(ctx);
}
long l2 = System.nanoTime();
System.out.println( (l2-l1)/1000000f + "ms" );
System.out.println( result );
}
// 结果:解释运行4550ms,编译运行:619ms。

我们当前项目内的解释器,同样执行"5000*12+7500"。
解释运行216ms,编译运行:正在开发!
不知道秒内千万次的速度如何得出的?
27 楼 liuye 2012-04-05 15:32
lotusyu 写道
liuye 写道
测试了一下,fast-el,aviator,mvel,都使用编译模式,fast-el比aviator,mvel快一倍.

我不知道你的测试有没有包含编译时间,测试的表达式是什么。如果不包含编译时间的话,fel在一般情况下要快几倍甚至几十倍。

都不包含编译时间。
26 楼 hatedance 2012-04-02 09:14
什么快不快的,都编译成字节码了,一样快。
25 楼 yhjhoo 2012-04-01 22:23
为什么要是用这个? 就为了表达式?
24 楼 gr4ve 2012-04-01 20:49
t42dw 写道
fresty 写道
与Mvel比较,性能相差很多。
比较代码:
                ------------------Fel-------------------------
System.out.println(System.currentTimeMillis());
for (int i = 0; i < 100000; i++) {
FelEngine fel = new FelEngineImpl();
Object result = fel.eval("5000*12+7500");
tempresult = result;
}
System.out.println(System.currentTimeMillis());
                ------------------mvel------------------------
                System.out.println(System.currentTimeMillis());
for (int i = 0; i < 100000; i++) {
Object o = MVEL.eval("5000*12+7500");
tempresult = o;
}
System.out.println(System.currentTimeMillis());
执行结果:
----------fel-----------
1333171203209
1333171206856
3.65s
----------mvel----------
1333171206856
1333171207909
1.05s

兄弟 FelEngine fel = new FelEngineImpl();放在循环里不公平吧...

MVEL 用的是也是eval...不是compile 其实也没啥不公平的
23 楼 小叮当 2012-04-01 18:45
xingqiliudehuanghun 写道
以前做的一个项目需要蒙特卡洛计算,而计算公式是前端输入的。计算量最少也要几万次。当时试了rhino、beanShell性能都不行,后来没办法了用了janino这动态编译库,把
需要计算的语句直接生成JAVA代码,然后缓存生成的对象,这样效率高了很多。几万次循环也就几个毫秒左右。后来转行做JS了也就没研究过这东西


缓存2字, 点出了性能差距. 其实,很多人都说, 反射耗时. 但是, 如果你把发射需要的一些信息缓存起来, 一样性能彪悍.
22 楼 litian33 2012-04-01 16:10
有点夸张,我有个性能表达式800次匹配,使用自己的字符串处理要9秒钟,使用这个工具则要59秒

可能是表达式比较复杂,不过这个工作作者“每秒可以执行千万次表达式”,有点太那个了
21 楼 NSCoffee 2012-04-01 13:31
lotusyu 写道
NSCoffee 写道
能不能多提供一些 这个技术的具体应用场景。试了一下,对于调用Java代码,如果有逗号,会出啦一个类似错误的东西
line 1:32 no viable alternative at character ';'

去掉';'再试试,Fel只支持表达式,没有必要使用';'。
应用场景有很多,比如要动态的控制一些业务规则,这些业务规则经常需要改变,不能硬编码。也可以用于公式计算、数据处理和校验。凡是需要用户输入表达式的地方,都有可能用到表达式引擎。


其实我想说的是这样的一个功能,代码如下
@Test
	public void testInvokeJava(){
		FelContext context=engine.getContext();
		context.set("out", System.out);
		StringBuffer buffer=new StringBuffer();
		buffer.append("out.println('使用fastEl执行java代码。')");
		buffer.append("out.println('test')");
		engine.eval(buffer.toString());
	}
	


上面的代码只能输出”使用fastEl执行java代码。“ test不会被输出。如果两句之间加个分号,两句都能执行就好了。
20 楼 lotusyu 2012-04-01 12:03
NSCoffee 写道
能不能多提供一些 这个技术的具体应用场景。试了一下,对于调用Java代码,如果有逗号,会出啦一个类似错误的东西
line 1:32 no viable alternative at character ';'

去掉';'再试试,Fel只支持表达式,没有必要使用';'。
应用场景有很多,比如要动态的控制一些业务规则,这些业务规则经常需要改变,不能硬编码。也可以用于公式计算、数据处理和校验。凡是需要用户输入表达式的地方,都有可能用到表达式引擎。
19 楼 NSCoffee 2012-04-01 11:34
能不能多提供一些 这个技术的具体应用场景。试了一下,对于调用Java代码,如果有逗号,会出啦一个类似错误的东西
line 1:32 no viable alternative at character ';'
18 楼 mengyancui 2012-04-01 11:15
1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1
17 楼 mengyancui 2012-04-01 11:15
1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1
16 楼 mengyancui 2012-04-01 11:14
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

发表评论

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

相关推荐

  • spring的集群问题的疑惑

    现在公司里有一个项目,想做spring的集群,现在他们的做法是一台webserver,比如说tomcat,然后把spring的应用部署到多个applicationserver上,然后webserver通过ejb的rmi来调用applicationserver上的spring程序,...

  • 关于集群的疑惑

    为啥 两个注册中心,彼此互相注册, 服务提供方两个 ,他们都想其中一个甲注册中心注册,为啥甲宕机了,访问还能成功,不该歇菜嘛? 控制台一直报错,服务但还能正常这个是为啥 ...

  • springboot2.1.8/springsecurity借助redis完成session集群管理

    在这之前我是没接触过spring-session的,并且还就真手写过利用jedis操作redis来实现session共享的代码,所以当时为了搞清这块业务,就想当然的一个劲地找jedis操作redis的相关逻辑,最后实在找不到还很疑惑的问一个...

  • SpringCloud-Eureka服务端集群如何同步(5)

    其中第五点涉及到服务器端集群同步问题我们并没有进行深入了解,在这里,我们将进行一次探索。 // 获取集群中的其他节点,注册到当前节点上 int registryCount = this.registry.syncUp(); 二.集群同步 1.为什么要...

  • Spring Boot 集成 Redis 三种模式实践汇总

    项目的某个模块集成了 SpringBoot Redis 包,客户端使用 Lettuce,Redis 测试环境单机模式。但是现场反馈的 Redis 环境是集群,如果简单的修改 `spring.redis` 配置为集群的配置信息,程序能否能无缝衔接呢?

  • SpringSession

    为什么要spring-session比较traditional-session方案和spring-session方案JSR340规范与spring-session的透明继承spring-session提供集群环境下HttpSession的透明集成。spring-session的优势在于开箱即用,具有较强的...

  • 【云原生】Spring Cloud是什么?Spring Cloud版本介绍

    SpringCloud是基于SpringBoot提供了一套微服务解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件,除了基于NetFlix的开源组件做高度抽象封装之外,还有一些选型中立的开源组件...

  • spring整合mongodb集群

    很多同学用Spring封装的MongoDB包时都会对多个MongoDB的负载均衡疑惑, Spring到底是如何做负载均衡呢? 由于本文中心不是解析此问题,只做稍微解释:Spring启动了多个线程,每个线程的工作为ping一下要连接的Mongo...

  • 超详细的SpringCloud底层原理

    SpringCloud框架 针对这个架构图我分层介绍一下: 1、是web服务器的选型,这个我选择的是nginx+keepalived,haproxy也是一个选择,但是haproxy在反向代理处理跨域访问的时候问题很多。所以我们nginx有些地方做了...

  • 【SpringCloud】SpringCloud之微服务网关GateWay

    文章目录前言一、SpringCloud GateWay概述1.1 Zuul1.x的缺陷1.2 Spring WebFlux1.3 GateWay工作流程二、GateWay实战2.1 Spring Cloud Gateway中的Predicate介绍2.2 Spring Cloud Gateway中的Filter介绍2.2.1 自定义...

  • 【1.3】Java微服务:Spring Cloud版本说明

    这篇文章主要说明了一些SpringCloud版本的说明和版本兼容的配置方法

  • SpringCloudAlibaba实战-nacos集群部署

    在学习阶段,我们想快速学习SpringCloudAlibaba功能,但总是花费大量时间跟着视频或博客做组件配置。...因此,本篇博客针对这一痛点,进行nacos集群部署记录。关于nacos的理论知识,以及单机版部署网上前人之述足矣。

  • Spring微服务实战第4章 服务发现

    文章目录第4章 服务发现4.1 我的服务在哪里4.2 云中的服务发现4.2.1 服务发现架构4.2.2 使用Spring和Netflix Eureka进行服务发现实战4.3 构建Spring Eureka服务4.4 通过Spring Eureka注册服务4.5 使用服务...

  • 关于Spring集成Quartz的一些小坑

    Spring Quartz

  • SpringCloud-Eureka配置和使用

    SpringCloud-Eureka配置 注意:Eureka新旧版本情况,旧版本已经被弃用,需要(建议)使用新的版本 旧版本:spring-cloud-starter-eureka-server,spring-cloud-starter-eureka 例子如下,如果使用下面这种方法,有...

  • SpringCloud学习笔记

    SpringCloud 内容知识 技术栈对比 服务拆分 远程调用 二、Eureka注册中心 搭建注册中心 服务注册 服务拉取 三、Ribbon负载均衡 源码跟踪 流程总结 负载均衡策略 自定义策略 饥饿加载 四、Nacos注册...

  • Spring Cloud Alibaba 核心组件解析

    Name Server:分布式系统中通过 DNS、VIP(Vritual IP)或者地址来实现集群的服务路由。 Nacos Server:Nacos 服务的提供者。 OpenAPI:提供给外部的功能访问入口。 Config Service:配置服务。 Naming Service:...

  • 你说你会Spring和分布式,那你知道它们怎么演化来的吗?

    知其然更要知其所以然! 现在我们所熟知的微服务,spring,负载均衡,分布式等等技术框架和技术架构,它们的发展都是有着必然联系的。让我们追本溯源,纵览分布式的近20年发展历程。

  • 非常哇塞的 Spring Boot 性能优化长文

    对于如何定位到复杂分布式环境中的问题,我这里想要分享另外一个工具:Skywalking。 Skywalking是使用探针技术(JavaAgent)来实现的。通过在Java的启动参数中,加入javaagent的Jar包,即可将性能数据和调用链数据...

  • 级联H桥SVG无功补偿系统在不平衡电网中的三层控制策略:电压电流双闭环PI控制、相间与相内电压均衡管理,级联H桥SVG无功补偿系统在不平衡电网中的三层控制策略:电压电流双闭环PI控制、相间与相内电压均

    级联H桥SVG无功补偿系统在不平衡电网中的三层控制策略:电压电流双闭环PI控制、相间与相内电压均衡管理,级联H桥SVG无功补偿系统在不平衡电网中的三层控制策略:电压电流双闭环PI控制、相间与相内电压均衡管理,不平衡电网下的svg无功补偿,级联H桥svg无功补偿statcom,采用三层控制策略。 (1)第一层采用电压电流双闭环pi控制,电压电流正负序分离,电压外环通过产生基波正序有功电流三相所有H桥模块直流侧平均电压恒定,电流内环采用前馈解耦控制; (2)第二层相间电压均衡控制,注入零序电压,控制通过注入零序电压维持相间电压平衡; (3)第三层相内电压均衡控制,使其所有子模块吸收的有功功率与其损耗补,从而保证所有H桥子模块直流侧电压值等于给定值。 有参考资料。 639,核心关键词: 1. 不平衡电网下的SVG无功补偿 2. 级联H桥SVG无功补偿STATCOM 3. 三层控制策略 4. 电压电流双闭环PI控制 5. 电压电流正负序分离 6. 直流侧平均电压恒定 7. 前馈解耦控制 8. 相间电压均衡控制 9. 零序电压注入 10. 相内电压均衡控制 以上十个关键词用分号分隔的格式为:不

Global site tag (gtag.js) - Google Analytics