轻量级高性能的表达式求值器——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引用(感谢许老大的帮助):
<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:
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(3);
list.add(100);
list.add(-100);
env.put("list", list);
可以做这么几个事情,度量大小:
这些函数类似FP里的高阶函数,使用起来还是非常爽的。
对函数调用的优化,其实只干了一个事情,原来函数调用我是将所有参数收集到一个list里面,然后再转成数组元素交给AviatorFunction调用。这里创建了两个临时对象:list和数组。这其实是没有必要的,我只要在AviatorFunction里定义一系列重载方法,如:
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);
![](http://www.blogjava.net/Images/dot.gif)
![](http://www.blogjava.net/Images/dot.gif)
就不需要收集参数,而是直接invokeinterface调用AviatorFunction相应的重载方法即可。我看到在JRuby和Clojure里的方法调用都这样干的。过去的思路走岔了。最终也不需要区分内部的method和外部的function,统一为一个对象即可,进一步减少了对象创建的开销。
文章转自庄周梦蝶 ,原文发布时间 2011-07-13
相关文章
- IaC 9大好处和4大工具
- 使用React Native可以开发Window桌面应用了!
- Serverless计算与容器技术:您应该使用哪一种?
- 开发的AI程序员“抄”代码,被骂惨的GitHub到底冤不冤?
- Vue.js 项目前端多语言方案
- 手把手带你彻底掌握,任务队列、事件循环、宏任务、微任务
- 一块自制自行车码表从B站火到GitHub,稚晖君点赞,网友催量产
- 深入理解浏览器的缓存机制
- 最近 GitHub 上很火的七个项目
- 推荐一个标星115K的GitHub开源项目,拿下算法不是问题
- HarmonyOS《鸿蒙操作系统开发入门经典》|第二篇 第3章
- 用了这么久的require,你真的懂它的原理吗?
- 一篇带给你ETCD入门指南
- Kubernetes使用NVMe有哪些好处?
- 再见了,Teamviewer!
- 一文彻底搞懂EventBus3.0事件总线框架原理
- O(n)的算法居然超时了,此时的n究竟是多大?
- ArrayList 从源码角度剖析底层原理
- HarmonyOS服务卡片-古诗词学习
- 大规模信息流推荐系统 研发效能提升之优秀实践