该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间: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] ------------------------------------------------ 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-04-10
从性能测试的结果来看,性能上面的优势太大了
|
|
返回顶楼 | |
发表时间:2007-04-10
不知道这个对比权威不,另外考虑ww 能不能吧ognl换掉呢~~~
|
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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的时候的问题?谢谢 |
|
返回顶楼 | |
发表时间:2007-04-10
sonic_yj 写道 正在用M1,不过不知道你说的这个东东什么东西,看起来应该是个很重大的调整,M1的文档又是一片空白,能说详细点么,帮助我这种刚入门的用户了解多一点。 BTW,你提到了一个Hibernate问题。能具体点么,是第一次加载环境变量的时候慢,还是说用From在规则内加载外部Fact的时候的问题?谢谢 3.1应该有很大的变动,还是等他的文档更新再用吧。因为drl的语法肯定有新的简单的写法,这是我期待的。 关于el,就是表达式语言,google应该有很多内容。 hibernate的问题是因为做了全表的查询,然后把所有记录丢入drools 的working memory中,因为做了set-one-to-many的关联 导致非常多的查询,主要性能瓶颈在这个地方。 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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怎么编译? |
|
返回顶楼 | |
发表时间:2007-04-11
我这里大约快了3ms,和一个规则集500ms+的耗时比较起来确实没有什么值得多提的。
|
|
返回顶楼 | |
发表时间: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倍。 |
|
返回顶楼 | |