轻量级高性能的表达式求值器——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,统一为一个对象即可,进一步减少了对象创建的
开销。
分享到:
相关推荐
《Aviator:高性能Java表达式求值程序的深入解析》 Aviator,作为一个轻量级且高效的Java表达式执行引擎,其设计目标是为开发者提供一种动态编译和执行表达式的能力,使得在运行时能够灵活处理各种计算逻辑。这个...
Aviator是一个高性能、轻量级的Java语言实现的表达式求值引擎,主要用于各种表达式的动态求值。它的设计目标是轻量级和高性能,相比于Groovy、JRuby等语言,Aviator非常小,即使加上依赖包也只有450K,不加依赖包更...
官方版本,亲测可用
Aviator——轻量级Java表达式求值引擎,这个是下载下来的jar包,版本是4.1.2
Aviator是一个为Java设计的高效且轻量级的表达式求值引擎,它的主要功能是解析并执行动态的字符串表达式,为应用程序提供灵活的数据处理能力。在Java开发中,尤其是在需要动态计算或者业务规则频繁变化的场景下,...
尽管市面上已经存在多种用于动态求值的Java表达式引擎,但Aviator以其独特的设计目标——轻量级和高性能——脱颖而出。相较于Groovy或JRuby等更为复杂的脚本语言,Aviator的体积更小(加上所有依赖包仅450KB,若不计...
官方版本,亲测可用
Aviator是一个高性能、轻量级的基于java实现的表达式引擎,它动态地将String类型的表达式编译成Java ByteCode并交给JVM执行。 Aviator支持所有的关系运算符和算术运算符,不支持位运算,同时支持表达式的优先级,...
Aviator是一个强大的Java库,专为高效且轻量级的表达式求值设计。它作为一个表达式解析器和引擎,允许在运行时动态地评估各种复杂的逻辑和计算表达式。这个压缩包包含了从Aviator 2.1版本到3.11版本的jar包,覆盖了...
Aviator是一款开源的轻量级、高性能的表达式求值引擎,主要应用于Java环境中。它设计的目的是为了方便地在程序运行时动态执行复杂的逻辑表达式,为开发者提供了灵活的数据处理能力。Aviator 2.3.0是该库的一个稳定...
赠送jar包:aviator-5.2.6.jar; 赠送原API文档:aviator-5.2.6-javadoc.jar; 赠送源代码:aviator-5.2.6-sources.jar; 赠送Maven依赖信息文件:aviator-5.2.6.pom; 包含翻译后的API文档:aviator-5.2.6-javadoc-...
这是一款由Google开发的开源项目,主要功能是实现动态的、高性能的表达式计算。Aviator的设计理念是提供一个强大的计算引擎,使得开发者可以在运行时动态构建和执行表达式,极大地提升了开发效率。 Aviator的核心...
Aviator 是一个强大的 Java 表达式执行引擎,它允许你在运行时动态计算表达式,类似于 JavaScript 或者其他脚本语言。在Java应用中,Aviator 特别适合用于数据分析和处理,例如对 List 中的数据进行求和、排序、找出...
作为一个轻量级的规则引擎,Aviator 提供了一种简洁而强大的方式来处理动态计算和决策过程。本文将深入探讨 Aviator 的核心概念、功能特性以及如何在实际项目中应用。 ### 1. Aviator 的核心概念 #### 1.1 表达式 ...
Fel(Fast Expression Language)是开放的、高效的、轻量级的表达式语言。拥有解释执行和编译执行双引擎。Fel在编译执行时,做了很多优化,适合处理海量数据。Fel扩展性强,用户可以定制Fel执行时的众多环节,以满足...
赠送jar包:aviator-5.1.4.jar; 赠送原API文档:aviator-5.1.4-javadoc.jar; 赠送源代码:aviator-5.1.4-sources.jar; 赠送Maven依赖信息文件:aviator-5.1.4.pom; 包含翻译后的API文档:aviator-5.1.4-javadoc-...
赠送jar包:aviator-5.2.6.jar; 赠送原API文档:aviator-5.2.6-javadoc.jar; 赠送源代码:aviator-5.2.6-sources.jar; 赠送Maven依赖信息文件:aviator-5.2.6.pom; 包含翻译后的API文档:aviator-5.2.6-javadoc-...
赠送jar包:aviator-5.1.4.jar; 赠送原API文档:aviator-5.1.4-javadoc.jar; 赠送源代码:aviator-5.1.4-sources.jar; 赠送Maven依赖信息文件:aviator-5.1.4.pom; 包含翻译后的API文档:aviator-5.1.4-javadoc-...
set ScriptEngineFactory.getLanguageName return aviator by @qiukeren in #525 Improve class cache performance when class not found by @jiudc in #522 fix: capitalize java bean property names by @killme...
飞行员脚本 | :open_book:中文文档AviatorScript是一门高级,轻量级寄宿于JVM之上的脚本语言。特性介绍支持数字,字符串,正则表达式,布尔值,正则表达式等,完整支持所有Java运算符及优先级等。是一等公民,支持。...