`
jindw
  • 浏览: 508957 次
  • 性别: Icon_minigender_1
  • 来自: 初到北京
社区版块
存档分类
最新评论

Ognl/MVEL/Aviator/JSEL 四种表达式引擎执行效率对比

    博客分类:
  • Java
阅读更多
为了配合一下JSEL的发布推广,做了一下性能测试。
说实在的,真不想做这类测试,太无趣了。


首先说明一下,这个表达式测试并不专业,我只是随便拿了一下我们 飞行大亨 Aviator的几个用例随便做的一个测试,吧数据记录一下,希望对大家有个参考价值:

对比的表达式系统有:
  •   老牌的Ognl(老到网站都找不到了)
  •   新来的MVEL
  •   国产的Aviator
  •   目前最快的JSEL:JSEL


测试表达式:
//常量运算1
1000+100.0*99-(600-3*15)%(((68-9)-3)*2-100)+10000%7*71
//常量运算2
6.7-100>39.6 ? 5==5? 4+5:6-1 : !(100%3-39.0<27) ? 8*2-199: 100%3
//变量+常量复合运算
i * pi + (d * b - 199) / (1 - d * pi) - (2 + 100 - i / pi) % 99 ==i * pi + (d * b - 199) / (1 - d * pi) - (2 + 100 - i / pi) % 99
//简单变量处理
i * pi
//简单常量处理
1


测试数据模型:
vars.put("i",100);
vars.put("pi",3.14f);
vars.put("d",-3.9);
vars.put("b",(byte)4);
vars.put("bool",false);


先来一个总体效果吧:
有图有真相,给大家一个直接的效果吧(1000*1000次运算耗时图,单位为秒)


很明显,数据看不下去了,因为Ognl这个害群之马,太慢了,和别的引擎差距太明显,导致其他的差距看不出来了。

吧害群之马干掉,再看看(没删除干净,是在不好意思,MVEL也有问题,变量处理太慢了):



还是单独看看吧:

JSEL与Aviator消耗对比图




JSEL与MVEL消耗对比图


把MVEL 那个差距最大的去掉,看看其他的差距



原始测试数据
图表上看不清细节,贴一下原始数据:
Source:1000+100.0*99-(600-3*15)%(((68-9)-3)*2-100)+10000%7*71
Aviator:
value:11181.0
time:2.660937(s)

MVEL:
value:11181.0
time:0.11660712(s)

Ognl:
value:11181.0
time:90.7111(s)

JSEL:
value:11181.0
time:0.02078729(s)

Source:6.7-100>39.6 ? 5==5? 4+5:6-1 : !(100%3-39.0<27) ? 8*2-199: 100%3
Aviator:
value:1
time:2.1668231(s)

MVEL:
value:-7
time:0.33598384(s)

Ognl:
value:1
time:82.08548(s)

JSEL:
value:1
time:0.020102492(s)

Source:i * pi + (d * b - 199) / (1 - d * pi) - (2 + 100 - i / pi) % 99 ==i * pi + (d * b - 199) / (1 - d * pi) - (2 + 100 - i / pi) % 99
Aviator:
value:true
time:6.8001246(s)

MVEL:
value:true
time:115.0054(s)

Ognl:
value:true
time:113.09844(s)

JSEL:
value:true
time:3.3340743(s)

Source:i * pi
Aviator:
value:314.0000104904175
time:1.9424591(s)

MVEL:
value:314.0000104904175
time:5.068285(s)

Ognl:
value:314.0000104904175
time:46.878913(s)

JSEL:
value:314.0
time:0.28054053(s)

Source:1
Aviator:
value:1
time:1.564514(s)

MVEL:
value:1
time:0.11306722(s)

Ognl:
value:1
time:40.87699(s)

JSEL:
value:1
time:0.013243402(s)




测试代码:
http://templatetest.googlecode.com/svn/trunk/TT/src/com/googlecode/templatetest/ELTimeTest.java

总结
太晚了,先睡觉,明天再来继续。。。。。
分享到:
评论
22 楼 oznyang 2010-12-30  
ongl里面代码太繁琐了,一个简单的转型,调用堆栈都好几十层,实在是吃不消,大为试试freemarker里面的表达式求值看看,应该效率不错
21 楼 panlw 2010-12-30  
MVEL有没有编译过?编译前后性能相差很多很多。
20 楼 olivechinese 2010-08-12  
兄弟,有没有 和 jexl 比较过啊????
想知道这个结果
19 楼 jindw 2010-08-11  
刚才测试有误,重新测试了一下Ognl,加上了1.7.1的字节码优化:
		OgnlContext oc = (OgnlContext)Ognl.createDefaultContext(null);
		Node result = Ognl.compileExpression(oc, context, source);

运行速度确实上来了,基本和JSEL相当,但是他这种优化好像太静态化了,比如变量只能通过javabean的getter方法提供,我给个map都不行,这个优化也太猛了点,有伤易用性的。

Source:1000+100.0*99-(600-3*15)%(((68-9)-3)*2-100)+10000%7*71
Ognl:
value:11181.0
time:0.0194656(s)

JSEL:
value:11181.0
time:0.020450238(s)

Source:6.7-100>39.6 ? 5==5? 4+5:6-1 : !(100%3-39.0<27) ? 8*2-199: 100%3
Ognl:
value:1
time:0.0249906(s)

JSEL:
value:1
time:0.015976602(s)

Source:i * pi
Ognl:
value:314.0
time:0.059526015(s)

JSEL:
value:314.0
time:0.2599812(s)

Source:1
Ognl:
value:1
time:0.014142064(s)

JSEL:
value:1
time:0.013489774(s)

18 楼 jindw 2010-08-11  
jansel 写道
OGNL 至少也应该使用2.7.*吧 加入了字节码优化功能


测试了一下 OGNL 2.7.1,确实改进了不少。不过,和JSEL差距还是很明显的:)
Source:1000+100.0*99-(600-3*15)%(((68-9)-3)*2-100)+10000%7*71
Ognl:
value:11181.0
time:1.0606151(s)

JSEL:
value:11181.0
time:0.020270592(s)

Source:6.7-100>39.6 ? 5==5? 4+5:6-1 : !(100%3-39.0<27) ? 8*2-199: 100%3
Ognl:
value:1
time:0.95045424(s)

JSEL:
value:1
time:0.016021512(s)

Source:i * pi + (d * b - 199) / (1 - d * pi) - (2 + 100 - i / pi) % 99 ==i * pi + (d * b - 199) / (1 - d * pi) - (2 + 100 - i / pi) % 99
Ognl:
value:true
time:1.3603102(s)

JSEL:
value:true
time:3.2627156(s)

Source:i * pi
Ognl:
value:314.0000104904175
time:0.48167065(s)

JSEL:
value:314.0
time:0.25570947(s)

Source:1
Ognl:
value:1
time:0.4346729(s)

JSEL:
value:1
time:0.013648035(s)


最新版本的 Struts2 用的是ognl-2.6.11.jar
Webwork2.7才升級到2.7的,目前,OGNL还是以2.6为主的天下。
而OGNL的官方网站也关闭了 www.ognl.org,也不知道这个项目以后会怎么发展
17 楼 jansel 2010-08-11  
OGNL 至少也应该使用2.7.*吧 加入了字节码优化功能
16 楼 colorless 2010-08-10  
jindw 写道
colorless 写道
ognl 你用的是什么版本?这个应该会有很大区别

ognl-2.6.11.jar
mvel2-2.0.17.jar


http://grepcode.com/snapshot/repo1.maven.org/maven2/ognl/ognl/3.0

是否可以拿ognl-3.0来测试一下?
15 楼 metadmin 2010-08-09  
没有提到beanshell哦

我的开源软件使用beanshell的
14 楼 srdrm 2010-08-09  
想了解一下,一般表达式引擎在什么场景下使用比较多。

大家都用在了什么场景。 其实应用应该蛮多,有没有真正用到项目中的?
13 楼 jindw 2010-08-09  
colorless 写道
ognl 你用的是什么版本?这个应该会有很大区别

ognl-2.6.11.jar
mvel2-2.0.17.jar
12 楼 colorless 2010-08-09  
ognl 你用的是什么版本?这个应该会有很大区别
11 楼 long502147 2010-08-09  
struts2不就是用的ognl表达式么?ognl不会那么差吧!
10 楼 jindw 2010-08-09  
<div class="quote_title">joyfun 写道</div>
<div class="quote_div">不一定要图呀 出个表格多好呀 图悬殊太大真是没法看</div>
<p> </p>
<p>OK,满足你^_^</p>
<p> </p>
<p> </p>
<p> </p>
<table style="border-collapse: collapse; width: 270pt;" border="0" cellspacing="0" cellpadding="0" width="360">
<col style="width: 54pt;" span="5" width="72">
<tbody>
<tr style="height: 13.5pt;" height="18">
<td style="height: 13.5pt; width: 54pt;" width="72" height="18"><span> </span></td>
<td style="width: 54pt;" width="72">JSEL</td>
<td style="width: 54pt;" width="72">Aviator2</td>
<td style="width: 54pt;" width="72">MVEL</td>
<td style="width: 54pt;" width="72">Ognl</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td style="height: 13.5pt;" height="18">1000+..</td>
<td align="right">0.020787</td>
<td align="right">2.660937</td>
<td align="right">0.116607</td>
<td align="right">90.7111</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td style="height: 13.5pt;" height="18">6.7-..</td>
<td align="right">0.020102</td>
<td align="right">2.166823</td>
<td align="right">0.335984</td>
<td align="right">82.08548</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td style="height: 13.5pt;" height="18">i * pi +..</td>
<td align="right">3.334074</td>
<td align="right">6.800125</td>
<td align="right">115.0054</td>
<td align="right">113.0984</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td style="height: 13.5pt;" height="18">i * pi</td>
<td align="right">0.280541</td>
<td align="right">1.942459</td>
<td align="right">5.068285</td>
<td align="right">46.87891</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td style="height: 13.5pt;" height="18" align="right">1                <br>
</td>
<td align="right">0.013243</td>
<td align="right">1.564514</td>
<td align="right">0.113067</td>
<td align="right">40.87699</td>
</tr>
</tbody>
</table>
9 楼 jindw 2010-08-09  
说一下总结吧,从目前的测试数据看,除Ognl差距最大外,其他几个系统都只有几倍的差距,可以认为是同一个数量级。

下面我发表一下个人的看法吧,仅供参考

MVEL2.0       有字节码优化,性能与Aviator相当,大多数情况下略快,但是也有超级慢的时候,特别是变量访问速度非常之慢,和Ognl有的一拼,最要命的是,在三目运算符处理的过程中有bug,导致和js规则,其他模板系统结果不同(或许是自身语法比较特殊,即使如此,也是不应该的)。

Aviator       有字节码优化,目前没发现什么大问题,不过,据作者报料,这个项目可能休眠下去。
JSEL          没有字节码优化,性能依然是最佳的,他也有一些表达式结构上的优化策略,比如,静态处理部分,将预处理成静态值,不会每次都重复计算。目前JSEL是Lite模板默认的表达式引擎,后续的维护会有更好的保障。
8 楼 joyfun 2010-08-09  
不一定要图呀 出个表格多好呀 图悬殊太大真是没法看
7 楼 jindw 2010-08-09  
kimmking 写道
jindw 写道
downpour 写道
这个执行效率的比较暂时停留在表达式求值领域,不知道在下面2个领域的表现如何:

1. 在复杂的对象树的求值上(多级对象级联、包含数组等)

2. 反向设值的过程 —— 通过表达式+字符串,往Java对象中设值


这确实是一个不够完善的测试数据。
差距确实也很明显,我想其他的数据应该类似吧。

我们也没有必要太纠葛于表达式性能了。多重视易用性更合适一点。
人家ognl慢又怎么样,慢你成百上千倍,近十年来,大家不也用的挺爽的,没有那个说要再快点嘛。呵呵。

jsel支持设值吗?

另外比较关注,lz能不能讲讲 jsel的设计~

thx
lz跟我的名字比较像



设值是支持的:
现在的JSEL命令行工具就是用到了JSEL的设值功能。
http://code.google.com/p/lite/wiki/CPEL
曾经也用它来做国类似webwork的servlet 参数=》JavaBean属性的自动转换,我想,用它来代替Struts2的OGNL应该也没什么问题吧,只是目前还没有试过。

JSEL的设计,有时间在专门写个帖子吧,呵呵
6 楼 weir2009 2010-08-09  
我觉得还是能说明点儿问题的。
5 楼 kimmking 2010-08-09  
jindw 写道
downpour 写道
这个执行效率的比较暂时停留在表达式求值领域,不知道在下面2个领域的表现如何:

1. 在复杂的对象树的求值上(多级对象级联、包含数组等)

2. 反向设值的过程 —— 通过表达式+字符串,往Java对象中设值


这确实是一个不够完善的测试数据。
差距确实也很明显,我想其他的数据应该类似吧。

我们也没有必要太纠葛于表达式性能了。多重视易用性更合适一点。
人家ognl慢又怎么样,慢你成百上千倍,近十年来,大家不也用的挺爽的,没有那个说要再快点嘛。呵呵。

jsel支持设值吗?

另外比较关注,lz能不能讲讲 jsel的设计~

thx
lz跟我的名字比较像
4 楼 jindw 2010-08-09  
downpour 写道
这个执行效率的比较暂时停留在表达式求值领域,不知道在下面2个领域的表现如何:

1. 在复杂的对象树的求值上(多级对象级联、包含数组等)

2. 反向设值的过程 —— 通过表达式+字符串,往Java对象中设值


这确实是一个不够完善的测试数据。
差距确实也很明显,我想其他的数据应该类似吧。

我们也没有必要太纠葛于表达式性能了。多重视易用性更合适一点。
人家ognl慢又怎么样,慢你成百上千倍,近十年来,大家不也用的挺爽的,没有那个说要再快点嘛。呵呵。
3 楼 downpour 2010-08-09  
这个执行效率的比较暂时停留在表达式求值领域,不知道在下面2个领域的表现如何:

1. 在复杂的对象树的求值上(多级对象级联、包含数组等)

2. 反向设值的过程 —— 通过表达式+字符串,往Java对象中设值

相关推荐

    Java SpEL、Ognl、MVEL2表达式Hook并记录小项目.zip

    Java SpEL、OGNL(Object-Graph Navigation Language)和MVEL是三种常见的表达式语言,它们在Java开发中被广泛用于动态逻辑的处理和对象属性的访问。在本项目中,我们将深入探讨这三个表达式语言的用法以及如何在...

    JS:ognl表达式

    ### JS:ognl表达式详解 #### 一、OGNL表达式概述 OGNL (Object-Graph Navigation Language) 是一种强大的表达式语言,用于获取和设置 Java 对象的属性。它最初是由 John Rose 和 Luke Blanshard 开发,并被广泛...

    表达式与言EL和OGNL

    **表达式语言(EL)与OGNL概述** 表达式语言(EL)是用于在Java应用程序中简洁地访问和操作对象属性的一种方式。它允许开发者通过简单的语法来读取和设置对象的属性,调用方法,以及执行其他面向对象的操作。在Java EE...

    ognl表达式 ognl表达式

    OGNL表达式在执行时需要一个上下文环境(Context),这个上下文环境通常是一个Map结构。在Struts2中,具体的上下文环境是`ActionContext`。`ActionContext`中的结构如下: - **request**:当前的HTTP请求。 - **...

    高速 Fel表达式引擎

    它具备快速执行的能力,与ognl等其他流行表达式引擎相比,具有更高的性能。 #### 二、核心概念 - **EL (Expression Language)**: 表达式语言,用于求解特定表达式的值。 - **AST (Abstract Syntax Tree)**: 抽象...

    OGNL表达式

    #### 四、OGNL表达式的具体用法 OGNL表达式通常结合Struts2的标签一起使用,比如使用 `&lt;s:property value="expression"/&gt;` 来展示数据。在使用过程中,需要注意#、%和$这三个符号的正确使用: - **#**:通常用于...

    ognl.zip 版本3.0.6

    OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。在版本3.0.6中,它提供了对Java对象图的灵活导航、动态方法调用以及数据绑定等功能。这个压缩包可能包含了OGNL库...

    ognl表达式java使用案例详解(测试通过)

    本案例提供ognl使用详解,测试通过,只需解压放入自己WEB项目中,执行struts_ognl包内java文件即可(未提供jia包,若需要可以联系留言发至邮箱),若测试不好可以联系本人提供指导. Struts 2默认的表达式语言是OGNL...

    struts2对Ognl的封装--PropertyAccessor

    在Struts2中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置对象的属性。"struts2对Ognl的封装--PropertyAccessor"这个主题主要涉及Struts2框架如何处理OGNL表达式,特别是如何...

    ognl表达式

    OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,常用于Java应用程序,特别是Web开发中的框架,如Struts 2。它允许开发者简洁、直观地访问和操作对象图,即对象之间的关联关系。理解并熟练掌握...

    Struts2 使用OGNL表达式

    在Struts2中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于数据绑定和表示层的数据交换。这篇博客文章可能详细探讨了如何在Struts2中使用OGNL来传递和操作数据。 OGNL是Struts2的核心...

    ognl表达式案例

    而OGNL(Object-Graph Navigation Language)是Struts2中使用的一种强大的表达式语言,用于在视图层和模型层之间传递数据。在本案例中,我们将深入探讨OGNL表达式的用法及其在Struts2中的应用。 首先,OGNL是一种...

    OGNL表达式的使用及文档

    OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。它被广泛应用于Spring框架和其他许多Java应用中,用于数据绑定和表达式评估。本篇将详细介绍OGNL的使用方法及其...

    Struts2深入学习----OGNL表达式原理

    OGNL是一种强大的表达式语言,允许开发者通过简单的字符串表达式来访问和修改对象图。在Struts2中,OGNL用于在Action和视图之间传递数据,以及在表单提交后自动将请求参数映射到Action属性。 OGNL表达式的基本语法...

    ognl和el区别

    OGNL是一种强大的表达式语言,它不仅支持对象属性的访问,还能够执行复杂的表达式计算。OGNL允许开发者通过简单的字符串表达式来获取或设置对象的属性,甚至调用方法、操作数组和集合等。例如,`user.name`可以用来...

    struts2 中 OGNL表达式的使用

    struts2 中 OGNL表达式的使用struts2 中 OGNL表达式的使用

    Struts2 如何使用OGNL表达式(三十八)

    在Struts2中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于在视图层和模型层之间进行数据绑定和表达式计算。本文将深入探讨如何在Struts2中有效地使用OGNL表达式。 首先,OGNL是Struts2的...

    el和ongl表达式学习

    在IT行业中,EL(Expression Language)和OGNL(Object-Graph Navigation Language)是两种常见的表达式语言,它们在Web开发中扮演着重要角色,尤其是在Java EE和Spring框架中。这两种语言都用于简化数据绑定和...

    ognl表达式教程

    ognl表达式的详细教学描述,介绍如何使用ognl表达式和ognl的运行原理

Global site tag (gtag.js) - Google Analytics