jboss rules3.1m终于用了一个el:mvel,性能与ognl的对比有些让人吃惊
引用
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]
------------------------------------------------ 1 楼 rainlife 2007-04-10 从性能测试的结果来看,性能上面的优势太大了 2 楼 差沙 2007-04-10 不知道这个对比权威不,另外考虑ww 能不能吧ognl换掉呢~~~ 3 楼 Readonly 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
4 楼 sonic_yj 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的时候的问题?谢谢 5 楼 eyejava 2007-04-10 sonic_yj 写道
正在用M1,不过不知道你说的这个东东什么东西,看起来应该是个很重大的调整,M1的文档又是一片空白,能说详细点么,帮助我这种刚入门的用户了解多一点。
BTW,你提到了一个Hibernate问题。能具体点么,是第一次加载环境变量的时候慢,还是说用From在规则内加载外部Fact的时候的问题?谢谢
3.1应该有很大的变动,还是等他的文档更新再用吧。因为drl的语法肯定有新的简单的写法,这是我期待的。
关于el,就是表达式语言,google应该有很多内容。
hibernate的问题是因为做了全表的查询,然后把所有记录丢入drools 的working memory中,因为做了set-one-to-many的关联 导致非常多的查询,主要性能瓶颈在这个地方。 6 楼 sonic_yj 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 7 楼 quaff 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怎么编译? 8 楼 dada 2007-04-11 我这里大约快了3ms,和一个规则集500ms+的耗时比较起来确实没有什么值得多提的。 9 楼 dada 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倍。
10 楼 yimlin 2007-04-11 看起来不错!3.0的时候就在想要是drools可以支持ognl,那么可以用更为自然的模型设计了。现在更好了,不但支持了,还提高了效率! 11 楼 cleverpig 2007-07-13 哪位同学知道如何使用MVEL啊?我想把它用做Object发射工具,看了一下API,感觉没有什么头绪。