轻量级高性能的表达式求值器——aviator发布2.0

标签: 开源 | 发表时间:2011-07-14 08:55 | 作者:boyan LightingMan
出处:http://rdc.taobao.com/team/jm

aviator是一个轻量级的、高性能的Java表达式求值器,主要应用在如工作流引擎节点条件判断、MQ中的消息过滤以及某些特定的业务场景。

自从上次发布1.0后,还发过1.01版本,不过都没怎么宣传。这次发布一个2.0的里程碑版本,主要改进如下:

1、完整支持位运算符,与java完全一致。位预算符对实现bit set之类的需求还是非常必须的。

2、性能优化,平均性能提升100%,函数调用性能提升200%,最新的与groovy和JEXL的性能测试看这里

http://code.google.com/p/aviator/wiki/Performance

3、添加了新函数,包括long、double、str用于类型转换,添加了string.indexOf函数。

4、完善了用户手册,更新性能测试。

下载地址:  http://code.google.com/p/aviator/downloads/list

项目主页:  http://code.google.com/p/aviator/

用户指南:  http://code.google.com/p/aviator/w/list

性能报告:  http://code.google.com/p/aviator/wiki/Performance

源码:          https://github.com/killme2008/aviator

Maven引用(感谢许老大的帮助):

<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>2.0</version>
</dependency>

这个项目目前用在我们的MQ产品中做消息过滤,也有几个公司外的用户告诉我他们也在用,不过估计不会很多。有这种需求的场景还是比较少的。这个项目实际上是为我们的MQ定制的,我主要想做到这么几点:

(1)控制用户能够使用的函数,不允许调用任何不受控制的函数。

(2)轻量级,不需要嵌入groovy这么大的脚本引擎,我们只需要一个剪裁过的表达式语法即可。

(3)高性能,最终的性能在某些场景比groovy略差,但是已经非常接近。

(4)易于扩展,可以容易地添加函数扩展功能。语法相对固定。

(5)函数的调用避免使用反射。因此没使用dot运算符的函数调用方式,而是更类似c语言和lua语言的函数调用风格。函数是一等公民,seq库的风格很符合我的喜好。

seq这概念来自clojure,我将实现了java.util.Collection接口的类和数组都称为seq集合,可以统一使用seq库操作。例如假设我有个list:

Map<String, Object> env = new HashMap<String, Object>();
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(3);
list.add(100);
list.add(-100);
env.put(“list”, list);
可以做这么几个事情,度量大小:
count(list)   判断元素是否存在:
include(list,3)   过滤元素,返回大于0的元素组成的seq:
filter(list,seq.gt(0))
对集合里的元素求和,应用reduce:
reduce(list,+,0)   遍历集合元素并打印:
map(list,println)   最后,你还可以排序:
sort(list)
这些函数类似FP里的高阶函数,使用起来还是非常爽的。

对函数调用的优化,其实只干了一个事情,原来函数调用我是将所有参数收集到一个list里面,然后再转成数组元素交给AviatorFunction调用。这里创建了两个临时对象:list和数组。这其实是没有必要的,我只要在AviatorFunction里定义一系列重载方法,如:
public AviatorObject call(Map<String, Object> env);

public AviatorObject call(Map<String, Object> env, AviatorObject arg1);

public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2);

public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2, AviatorObject arg3);

就不需要收集参数,而是直接invokeinterface调用AviatorFunction相应的重载方法即可。我看到在JRuby和Clojure里的方法调用都这样干的。过去的思路走岔了。最终也不需要区分内部的method和外部的function,统一为一个对象即可,进一步减少了对象创建的开销。

相关 [轻量级 性能 表达式] 推荐:

轻量级高性能的表达式求值器——aviator发布2.0

- LightingMan - 淘宝JAVA中间件团队博客
aviator是一个轻量级的、高性能的Java表达式求值器,主要应用在如工作流引擎节点条件判断、MQ中的消息过滤以及某些特定的业务场景. 自从上次发布1.0后,还发过1.01版本,不过都没怎么宣传. 这次发布一个2.0的里程碑版本,主要改进如下:. 1、完整支持位运算符,与java完全一致. 位预算符对实现bit set之类的需求还是非常必须的.

Fel是轻量级的高效的表达式计算引擎

- - CSDN博客推荐文章
Fel是轻量级的高效的表达式计算引擎. Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求. Fel是开放的,引擎执行中的多个模块都可以扩展或替换. Fel的执行主要是通过函数实现,运算符(+、-等都是Fel函数),所有这些函数都是可以替换的,扩展函数也非常简单. Fel有双引擎,同时支持解释执行和编译执行.

mmorpg:Java 编写的轻量级高性能手游服务端框架

- - IT瘾-dev
mmorpg,是一个用java编写的轻量级高性能手游服务端框架. 项目提供各种支持快速二次开发的组件,以及对生产环境的服务进行管理的工具. 同时,为了使用户能够快速上手,项目提供了若干常用业务功能作为演示. 支持socket/websocket接入,兼容手游/页游服务端架构. 有独立http后台网站,为游戏运维/运营提供支持.

正则表达式

- - CSDN博客推荐文章
    正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征. 比如 表达式“ab+” 描述的特征是“一个 'a' 和 任意个 'b' ”,那么 'ab', 'abb', 'abbbbbbbbbb' 都符合这个特征.     正则表达式可以用来:(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址.

轻量级Kubernetes k3s初探

- - InfoQ推荐
1 k3s简介–5 less than K8s. k3s [1] 是rancher®开源的一个Kubernetes发行版,从名字上就可以看出k3s相对k8s做了很多裁剪和优化,二进制程序不足50MB,占用资源更少,只需要512MB内存即可运行. 而之所以称为k3s是因为相对k8s裁剪了如下5个部分:.

新正则表达式

- Bloger - 博客园-首页原创精华区
很多网站需要将好的会员号留着,或用于日后的盈利. 实现方法不是本文讨论范围,本文仅列出用于检测靓号类型的一些正则.   靓号检测:主要可以检测连号(正连 12345、倒连65432)、AABB号、手机号码、日期号(生日号、年度号)、ABBCABB号,3位以上重复号. 更多类型号码检测可以根据以下表达式改造.

用 toto 快速建轻量级博客

- zhai - 博客园-首页原创精华区
对于程序员或创业团队来说,还是有必要拥有一个属于自己的博客. Wordpress 曾经让个人或企业搭建博客变得非常容易. 但是我们觉得 Wordpress 还是有些重量级,所以选择了一个非常轻便的工具 toto,一段只有200多行代码的Ruby应用程序. toto之所以简单,是因为它利用一些很好的工具和服务.

CintaNotes:轻量级笔记软件

- - 软件志
一、CintaNotes简介: 这是一款非常轻巧实用的笔记软件,体积仅1MB,可以很方便用快捷键从任意程序收集文本,或手工添加内容;收集的内容会保留来源url. 所有文本线性排列,并可添加标签(tag);搜索框中键入内容即可实时显示命中结果,非常方便——重要的是它支持UniCode,因此不存在中文搜索问题.

优秀的轻量级Web服务器

- - Solidot
Alison Neville 写道 "Web服务器是一种使用超文本传输协议(HTTP)响应客户端请求提供网页的计算机软件,以HTML文件、图像、样式表和脚本的形式构成网页内容. Apache是​​最流行的Web服务器软件,提供了最新的协议实现,优秀的特性集,具有高可配置和可扩展性. Apache被一半以上的活跃网站所使用.