论坛首页 Java企业应用论坛

jboss rules3.1m终于用了一个el:mvel,性能与ognl的对比有些让人吃惊

浏览 15245 次
该帖已经被评为良好帖
作者 正文
   发表时间:2007-04-10  
引用

Later I will also move templates from StringTemplate to MVEL, our template use is minimal so we don't really care what we use. MVEL is a needed dependency and already provides templates, so we might as well use that. The added bonus is that StringTemplate still relies on antlr-2.7.7, so I'll be able to remove 2 more dependencies.

按照这个本意仅仅是想减少两个包的依赖..丝毫不提mvel的优越性能啊,我倒看中这一点,目前项目中的规则运算巨慢,不过主要原因是hibernate查询导致的...

下面是性能对比:
http://mvel.codehaus.org/Performance+of+MVEL
===============================================
Test Platform        : Java 2 Standard Edition v1.6.0 final
Machine Spec.        : Intel Core Duo T2600 1.66Ghz / 2GB DDR2 533Mhz RAM / Windows Vista RTM
VM Options           : <<none>>
MVEL Build           : 1.2.0 Beta11 w/JIT
OGNL Build           : 2.6.11 Stable
===============================================

Test Name            : Simple String Pass-Through
Expression           : 'Hello World'
Iterations           : 50000
Interpreted Results  :
(OGNL)               : 1344.20ms avg.  (mem delta: -789kb) [1424,1393,1299,1302,1302]
(MVEL)               : 21.80ms avg.  (mem delta: -93kb) [22,21,22,21,23]
Compiled Results     :
(OGNL Compiled)      : 10.00ms avg.  (mem delta: -562kb) [14,9,8,10,9]
(MVEL Compiled)      : 0.60ms avg.  (mem delta: -18kb) [1,0,1,0,1]
------------------------------------------------
Test Name            : Shallow Property
Expression           : data
Iterations           : 50000
Interpreted Results  :
(OGNL)               : 1591.20ms avg.  (mem delta: -782kb) [1594,1603,1590,1588,1581]
(MVEL)               : 49.40ms avg.  (mem delta: -712kb) [49,51,49,49,49]
Compiled Results     :
(OGNL Compiled)      : 34.80ms avg.  (mem delta: -636kb) [35,34,34,36,35]
(MVEL Compiled)      : 1.80ms avg.  (mem delta: -18kb) [2,2,2,2,1]
------------------------------------------------
Test Name            : Deep Property
Expression           : foo.bar.name
Iterations           : 50000
Interpreted Results  :
(OGNL)               : 1955.20ms avg.  (mem delta: -790kb) [1936,1949,1943,1994,1954]
(MVEL)               : 114.80ms avg.  (mem delta: -112kb) [119,113,110,117,115]
Compiled Results     :
(OGNL Compiled)      : 92.80ms avg.  (mem delta: -580kb) [92,92,92,92,96]
(MVEL Compiled)      : 1.80ms avg.  (mem delta: -18kb) [1,2,2,2,2]
------------------------------------------------
Test Name            : Static Field Access (MVEL)
Expression           : Integer.MAX_VALUE
Iterations           : 50000
Interpreted Results  :
(MVEL)               : 90.00ms avg.  (mem delta: -658kb) [88,95,108,80,79]
Compiled Results     :
(MVEL Compiled)      : 2.40ms avg.  (mem delta: -337kb) [4,2,2,2,2]
------------------------------------------------
Test Name            : Static Field Access (OGNL)
Expression           : @java.lang.Integer@MAX_VALUE
Iterations           : 50000
Interpreted Results  :
(OGNL)               : 2036.20ms avg.  (mem delta: -791kb) [2119,2039,2118,1946,1959]
Compiled Results     :
(OGNL Compiled)      : 10.00ms avg.  (mem delta: -580kb) [13,9,9,10,9]
------------------------------------------------
Test Name            : Inline Array Creation (MVEL)
Expression           : {'foo', 'bar'}
Iterations           : 50000
Interpreted Results  :
(MVEL)               : 229.40ms avg.  (mem delta: -430kb) [217,217,230,247,236]
Compiled Results     :
(MVEL Compiled)      : 4.00ms avg.  (mem delta: -504kb) [5,3,4,4,4]
------------------------------------------------
Test Name            : Inline Array Creation (OGNL)
Expression           : new String[] {'foo', 'bar'}
Iterations           : 50000
Interpreted Results  :
(OGNL)               : 1824.80ms avg.  (mem delta: -845kb) [1847,1802,1828,1816,1831]
Compiled Results     :
(OGNL Compiled)      : 62.20ms avg.  (mem delta: -449kb) [63,64,62,62,60]
------------------------------------------------
Test Name            : Collection Access + Method Call
Expression           : funMap['foo'].happy()
Iterations           : 50000
Interpreted Results  :
(OGNL)               : 1968.20ms avg.  (mem delta: -788kb) [1959,1953,1949,2021,1959]
(MVEL)               : 114.40ms avg.  (mem delta: -150kb) [116,114,116,112,114]
Compiled Results     :
(OGNL Compiled)      : 112.80ms avg.  (mem delta: -636kb) [116,111,113,112,112]
(MVEL Compiled)      : 2.20ms avg.  (mem delta: -18kb) [3,2,2,2,2]
------------------------------------------------
Test Name            : Boolean compare
Expression           : data == 'cat'
Iterations           : 50000
Interpreted Results  :
(OGNL)               : 1623.20ms avg.  (mem delta: -782kb) [1620,1629,1624,1620,1623]
(MVEL)               : 99.40ms avg.  (mem delta: -673kb) [107,98,99,96,97]
Compiled Results     :
(OGNL Compiled)      : 54.40ms avg.  (mem delta: -541kb) [54,54,57,53,54]
(MVEL Compiled)      : 15.60ms avg.  (mem delta: -747kb) [16,15,16,16,15]
------------------------------------------------
Test Name            : Object instantiation
Expression           : new String('Hello')
Iterations           : 50000
Interpreted Results  :
(OGNL)               : 1864.40ms avg.  (mem delta: -784kb) [1872,1867,1870,1855,1858]
(MVEL)               : 236.00ms avg.  (mem delta: -450kb) [238,234,236,236,236]
Compiled Results     :
(OGNL Compiled)      : 193.00ms avg.  (mem delta: -449kb) [196,191,191,196,191]
(MVEL Compiled)      : 2.80ms avg.  (mem delta: -507kb) [3,3,3,2,3]
------------------------------------------------
Test Name            : Method access
Expression           : readBack('this is a string')
Iterations           : 50000
Interpreted Results  :
(OGNL)               : 1791.80ms avg.  (mem delta: -786kb) [1771,1775,1781,1814,1818]
(MVEL)               : 107.60ms avg.  (mem delta: -506kb) [109,108,108,106,107]
Compiled Results     :
(OGNL Compiled)      : 70.60ms avg.  (mem delta: -598kb) [69,73,71,71,69]
(MVEL Compiled)      : 2.40ms avg.  (mem delta: -18kb) [2,3,2,2,3]
------------------------------------------------
Test Name            : Arithmetic
Expression           : 10 + 1 - 1
Iterations           : 50000
Interpreted Results  :
(OGNL)               : 1812.00ms avg.  (mem delta: -371kb) [1853,1821,1798,1792,1796]
(MVEL)               : 108.40ms avg.  (mem delta: -620kb) [112,108,109,107,106]
Compiled Results     :
(OGNL Compiled)      : 9.40ms avg.  (mem delta: -580kb) [10,9,10,9,9]
(MVEL Compiled)      : 0.60ms avg.  (mem delta: -18kb) [1,0,1,0,1]
------------------------------------------------
   发表时间:2007-04-10  
从性能测试的结果来看,性能上面的优势太大了
0 请登录后投票
   发表时间:2007-04-10  
不知道这个对比权威不,另外考虑ww 能不能吧ognl换掉呢~~~
0 请登录后投票
   发表时间:2007-04-10  
Mvel看起来不错,和ognl完全兼容,不知道为啥比ognl快那么多,下载下来研究一下...

差沙 写道
不知道这个对比权威不,另外考虑ww 能不能吧ognl换掉呢~~~

这个在去年的webwork mail list上有讨论过:
http://forums.opensymphony.com/thread.jspa?threadID=44645

从xwork的代码结构来看,偶们需要弄一个ValueStack interface以及一个factory来创建OgnlValueStack或者MevlValueStack,实现上不难。

而且JIRA上面已经有人提交patch了

http://jira.opensymphony.com/browse/XW-461

http://issues.apache.org/struts/browse/WW-1566

3 请登录后投票
   发表时间:2007-04-10  
引用

Later I will also move templates from StringTemplate to MVEL, our template use is minimal so we don't really care what we use. MVEL is a needed dependency and already provides templates, so we might as well use that. The added bonus is that StringTemplate still relies on antlr-2.7.7, so I'll be able to remove 2 more dependencies.
按照这个本意仅仅是想减少两个包的依赖..丝毫不提mvel的优越性能啊,我倒看中这一点,目前项目中的规则运算巨慢,不过主要原因是hibernate查询导致的...




  正在用M1,不过不知道你说的这个东东什么东西,看起来应该是个很重大的调整,M1的文档又是一片空白,能说详细点么,帮助我这种刚入门的用户了解多一点。

   BTW,你提到了一个Hibernate问题。能具体点么,是第一次加载环境变量的时候慢,还是说用From在规则内加载外部Fact的时候的问题?谢谢
0 请登录后投票
   发表时间:2007-04-10  
sonic_yj 写道



  正在用M1,不过不知道你说的这个东东什么东西,看起来应该是个很重大的调整,M1的文档又是一片空白,能说详细点么,帮助我这种刚入门的用户了解多一点。

   BTW,你提到了一个Hibernate问题。能具体点么,是第一次加载环境变量的时候慢,还是说用From在规则内加载外部Fact的时候的问题?谢谢


3.1应该有很大的变动,还是等他的文档更新再用吧。因为drl的语法肯定有新的简单的写法,这是我期待的。
关于el,就是表达式语言,google应该有很多内容。
hibernate的问题是因为做了全表的查询,然后把所有记录丢入drools 的working memory中,因为做了set-one-to-many的关联 导致非常多的查询,主要性能瓶颈在这个地方。
0 请登录后投票
   发表时间:2007-04-10  
[quote="eyejava]
3.1应该有很大的变动,还是等他的文档更新再用吧。因为drl的语法肯定有新的简单的写法,这是我期待的。
关于el,就是表达式语言,google应该有很多内容。
hibernate的问题是因为做了全表的查询,然后把所有记录丢入drools 的working memory中,因为做了set-one-to-many的关联 导致非常多的查询,主要性能瓶颈在这个地方。


  文档我找到了一个,M1变化确实很大,我已经在用了,From , Collect 都很好用,暂时还不知道有什么其他新元素。至于你文章写的性能问题,我还是不太理解。。

  加载数据的问题我也有类似的困惑,因为可以用From,加载的数据到不一定全部加载,但是我也没确认到底一次加载效率高还是临时From加载效率高(目前我也就用到1w左右的数据量)我的感觉是透过Rule效率其实不低,不知道你涉及的数据量到底是什么样数量级的。至于one2many,基本上我个人不是太愿意用,感觉太逻辑了,写进去很难调整,而且这种东西Drools到底支持的如何,我还不太清楚,想听听你遇到的实际问题。

还有,似乎LHR里面无法直接使用From加载外部Fact的东东,不知道你遇到了么

   rule
     when
       li:ArrayList(size > 0) from collect( ds.search(hql) )
     then
       ....
   end
0 请登录后投票
   发表时间:2007-04-10  
引用

(OGNL Compiled)      : 9.40ms avg.  (mem delta: -580kb) [10,9,10,9,9]
(MVEL Compiled)      : 0.60ms avg.  (mem delta: -18kb) [1,0,1,0,1]
------------------------------------------------

ognl和mvel怎么编译?
0 请登录后投票
   发表时间:2007-04-11  
我这里大约快了3ms,和一个规则集500ms+的耗时比较起来确实没有什么值得多提的。
0 请登录后投票
   发表时间:2007-04-11  
eyejava 写道


3.1应该有很大的变动,还是等他的文档更新再用吧。因为drl的语法肯定有新的简单的写法,这是我期待的。
关于el,就是表达式语言,google应该有很多内容。
hibernate的问题是因为做了全表的查询,然后把所有记录丢入drools 的working memory中,因为做了set-one-to-many的关联 导致非常多的查询,主要性能瓶颈在这个地方。

简单写法倒是没有,就是实用了不少,或者说作者兑现了很多承诺。
po对象直接扔到memory中会出现什么好玩的问题吗?
我项目里面drools处理的是核心业务的东西,为了规避风险不敢直接把po往memory里面放。
我能想到的问题:
1. 该对象的一部分关系不需要初始化,drools会不会在访问对象的时候“不小心”初始化了?
2. 高范式的数据模型控制不住对象的数量规模和层次,从而影响规则引擎的效率。就我在选型的时候做的一些简单性能测试而言,对象越“平”,层次越少性能越好,性能差距在10倍-100倍。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics