高性能EL——Fel探秘,兼谈EL

简介:

Fel是最近javaeye比较火的关键词,这是由网友lotusyu开发的一个高性能的EL,从作者给出的数据来看,性能非常优异,跟前段时间温少开源的Simple EL有的一拼。首先要说,这是个好现象,国内的开源项目越来越多,可以看出开发者的水平是越来越高了,比如我最近还看到有人开源的类似kestel的轻量级MQ——fqueue也非常不错,有兴趣可以看下我的分析《fqueue初步分析》。

expression string -> antlr -> AST -> comiple -> java source template -> java class -> Expression 
FelEngine fel = new FelEngineImpl();
Expression exp 
= fel.comp
package com.greenpineyu.fel.compile;

import com.greenpineyu.fel.common.NumberUtil;
import com.greenpineyu.fel.Expression;
import com.greenpineyu.fel.context.FelContext;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;

public class Fel_0 implements Expression{

public Object eval(FelContext context) {
java.lang.Object var_1 
= (java.lang.Object)context.get(b); //
java.lang.Object var_0 = (java.lang.Object)context.get(a); //
return (ObjectUtils.toString(var_0))+(ObjectUtils.toString(var_1));
}

FelEngine fel = new FelEngineImpl();

Expression exp 
= fel.compile(a+bnull);
Map
<String, Object> env=new HashMap<String, Object>();
env.put(
a1);
env.put(
b3.14);
System.out.println(exp.eval(
new MapContext(env))); 

输出:

13.14 
com.greenpineyu.fel.exception.CompileException: package com.greenpineyu.fel.compile;

import com.greenpineyu.fel.common.NumberUtil;
import com.greenpineyu.fel.Expression;
import com.greenpineyu.fel.context.FelContext;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;

public class Fel_0 implements Expression{

public Object eval(FelContext context) {
java.lang.Object var_1 
= (java.lang.Object)context.get(b); //
java.lang.Object var_0 = (java.lang.Object)context.get(a); //
return (var_0)(var_1);
}
}

[Fel_0.java:
14: 运算符 不能应用于 java.lang.Object,java.lang.Object]
at com.greenpineyu.fel.compile.FelCompiler16.compileToClass(FelCompiler16.java:
113)
at com.greenpineyu.fel.compile.FelCompiler16.compile(FelCompiler16.java:
87)
at com.greenpineyu.fel.compile.CompileService.compile(CompileService.java:
66)
at com.greenpineyu.fel.FelEngineImpl.compile(FelEngineImpl.java:
62)
at TEst.main(TEst.java:
14)
Exception in thread 
main java.lang.NullPointerException
at TEst.main(TEst.java:
18
FelEngine fel = new FelEngineImpl();
fel.getContext().set(
a1);
fel.getContext().set(
b3.14);
Expression exp 
= fel.compile(a+bnull);
Map
<String, Object> env = new HashMap<String, Object>();
env.put(
a1);
env.put(
b3.14);
System.out.println(exp.eval(
new MapContext(env))); 
package com.greenpineyu.fel.compile;

import com.greenpineyu.fel.common.NumberUtil;
import com.greenpineyu.fel.Expression;
import com.greenpineyu.fel.context.FelContext;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;

public class Fel_0 implements Expression{

public Object eval(FelContext context) {
double var_1 = ((java.lang.Number)context.get(b)).doubleValue(); //
double var_0 = ((java.lang.Number)context.get(a)).doubleValue(); //
return (var_0)+(var_1);
}

可以看到这次将a和b都强制转为double类型了,做数值相加,结果也正确了:

4.140000000000001 

强类型还是弱类型,这是一个选择问题,如果你能在运行前就确定变量的类型,那么使用Fel应该可以达到或者接近于原生java执行的效率,但是失去了灵活性;如果你无法确定变量类型,则只能采用弱类型的EL。

EL涌现的越来越多,这个现象有点类似消息中间件领域,越来越多面向特定领域的轻量级MQ的出现,而不是原来那种大而笨重的通用MQ大行其道,一方面是互 联网应用的发展,需求不是通用系统能够满足的,另一方面我认为也是开发者素质的提高,大家都能造适合自己的轮子。从EL这方面来说,我也认为会有越来越多 特定于领域的,优点和缺点一样鲜明的EL出现,它们包含设计者自己的目标和口味,选择很多,就看取舍。

本文来源于"阿里中间件团队播客",原文发表时间" 2011-09-17"

相关文章
|
6月前
|
算法 数据可视化 前端开发
第三代软件开发-自定义Button
欢迎来到我们的 QML & C++ 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C++ 的强大功能,旨在开发出色的用户界面和高性能的后端逻辑。 在项目中,我们利用 QML 的声明式语法和可视化设计能力创建出现代化的用户界面。通过直观的编码和可重用的组件,我们能够迅速开发出丰富多样的界面效果和动画效果。同时,我们利用 QML 强大的集成能力,轻松将 C++ 的底层逻辑和数据模型集成到前端界面中。 在后端方面,我们使用 C++ 编写高性能的算法、数据处理和计算逻辑。C++ 是一种强大的编程语言,能够提供卓越的性能和可扩展性。我们的团队致力于优化代码,减少资
|
7月前
|
Java
20JavaWeb基础 - EL技术
20JavaWeb基础 - EL技术
25 0
|
7月前
|
JavaScript 前端开发
Vue嵌入式页面解决方案
Vue嵌入式页面解决方案
|
UED
element el-cascader动态加载数据 (多级联动,落地方案)
最近需要用到element ui的这个插件做地区的四级联动,但是碰了一些问题: 官网的说明太泛泛然,不易看懂 网上的教程乱七八糟,代码一堆一堆的 看这篇就对了!!!
1337 0
element el-cascader动态加载数据 (多级联动,落地方案)
|
3月前
|
JavaScript 前端开发 API
|
JavaScript API
10 个超强 Vue3 实战指南,由此突破新特性!(下)
本篇介绍 10 点如何从实战中学习突破 Vue JS 3 的新特性,细细看完,一定会有收获~
|
JavaScript 前端开发 API
10 个超强 Vue3 实战指南,由此突破新特性!(上)
本篇介绍 10 点如何从实战中学习突破 Vue JS 3 的新特性,细细看完,一定会有收获~
|
敏捷开发 消息中间件 开发框架
一代版本一代神:利用Docker在Win10系统极速体验Django3.1真实异步(Async)任务
Django官方发布3.0版本,内核升级宣布支持Asgi,这一重磅消息让无数后台研发人员欢呼雀跃,弹冠相庆。大喜过望之下,小伙伴们兴奋的开箱试用,结果却让人大跌眼镜:非但说好的内部集成Websocket没有出现,就连原生的异步通信功能也只是个壳子,内部并未实现,很明显的换汤不换药,这让不少人转身投入了[FastAPI](https://v3u.cn/a_id_167)的怀抱。不过一年之后,今天8月,Django3.1版本姗姗来迟,这个新版本终于一代封神,不仅支持原生的异步视图,同时也支持异步中间件,明显整了个大活。
一代版本一代神:利用Docker在Win10系统极速体验Django3.1真实异步(Async)任务
|
前端开发
前端工作总结270-el-table使用
前端工作总结270-el-table使用
79 0