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

简介:

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,统一为一个对象即可,进一步减少了对象创建的开销。

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

相关文章
|
1月前
|
缓存 安全 Java
|
1月前
|
Java Python
条件运算符与条件表达式:编程中的高效决策工具
在编程中,条件运算符和条件表达式是两种强大的工具,它们允许程序根据特定的条件来执行不同的操作或返回不同的值。这些工具不仅提高了代码的可读性和可维护性,还使得程序能够更灵活地处理各种情况。本文将深入介绍条件运算符和条件表达式的概念,并通过示例代码展示它们在实际编程中的应用。
13 1
|
1月前
|
C++
关系表达式:编程中的比较利器
在编程中,关系表达式扮演着至关重要的角色。它们允许我们比较两个或多个值,并基于这些比较的结果来执行相应的操作。关系表达式通过返回布尔值(真或假)来告诉我们两个值之间的关系,从而帮助我们在程序中做出决策。
15 0
|
1月前
什么是扩展运算符?使用场景
什么是扩展运算符?使用场景
15 0
|
2月前
|
SQL Arthas Java
OGNL表达式学习笔记(一) 基本特性与基本概念
OGNL表达式学习笔记(一) 基本特性与基本概念
|
2月前
什么是扩展运算符?有什么使用场景?
什么是扩展运算符?有什么使用场景?
|
3月前
|
JavaScript
连等表达式的核心原理
连等表达式的核心原理
|
11月前
|
存储 自然语言处理 算法
GaiaX开源解读 | 表达式作为逻辑动态化的基础,我们是如何设计的
GaiaX跨端模板引擎,是在阿里优酷、淘票票、大麦内广泛使用的Native动态化方案,其核心优势是性能、稳定和易用。本系列文章《GaiaX开源解读》,带大家看看过去三年GaiaX的发展过程。
238 0
|
人工智能 大数据 程序员
一文看懂开源图化框架中的循环设计逻辑!
相信大家在日常工作中,已经精通各种循环逻辑的实现。就拿我来说吧,多年的工作经验,已经让我可以熟练的使用 C++,Python,英语等多种语言,循环多次输出“hello word”。不过大家有没有想过一个这样的问题:如何在一个有向无环图(Directed Acyclic Graph,简称dag)中实现循环呢?
565 0
一文看懂开源图化框架中的循环设计逻辑!
|
存储 自然语言处理 算法
作为逻辑动态化的基础,GaiaX 表达式是如何设计的? | GaiaX 开源解读
GaiaX 跨端模板引擎,是在阿里文娱内广泛使用的 Native 动态化方案,其核心优势是性能、稳定和易用。本系列文章《GaiaX 开源解读》,带大家看看过去三年 GaiaX 的发展过程。 GaiaX 开源地址:https://github.com/alibaba/GaiaX
329 0
作为逻辑动态化的基础,GaiaX 表达式是如何设计的? | GaiaX 开源解读