`
jindw
  • 浏览: 500898 次
  • 性别: 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对象中设值

相关推荐

Global site tag (gtag.js) - Google Analytics