Well, I'd like to see an actual comparison.  I somehow doubt your parser,
which I note is using StringTokenizer will perform as well as MVEL's parser,
which is a much more computationally efficient sliding-window parser.


Brian Pontarelli wrote:
> 
> Right, but you can receive similar or better performance using a  
> linear runtime evaluation if the language is simple enough and tuned  
> for the web. And as you and I say, MVEL and most other languages  
> aren't targeted to the web and have many extra features.
> 
> I can't really believe that JUEL is that slow though. And if it really  
> is, it should be extremely simple to make it just as fast as MVEL. But  
> I couldn't say for certain because I don't know the code.
> 
> I ran some simple tests on getting and setting properties for the  
> JCatapult expression evaluator and here's what I got:
> 
> Retrieving from a JavaBean property ("user.age")   1ms
> Retrieving from a public member field ("user.age")   < 1ms
> Retrieving from a nested JavaBean property within a collection  
> ("user.addresses['home'].zipcode")   1ms
> Retrieving from a nested public member field within a collection  
> ("user.addresses['home'].zipcode")   1ms
> 
> Setting a JavaBean property with type conversion ("user.age")   1ms
> Setting a nested JavaBean property, with collections and Object  
> creation ("user.addresses['home'].zipcode")   2ms
> 
> That's definitely fast enough for my web applications. ;)
> 
> JCatapult does support using public member fields of classes and it  
> does shave a little bit of time, but nothing that would make a huge  
> difference. These are all runtime parsing and handling, nothing is  
> compiled or cached.
> 
> -bp
> 
> On Oct 11, 2008, at 3:09 PM, Chris Brock wrote:
> 
>>
>> The singleton pattern is used in MVEL, with knowledge of the  
>> tradeoff.  MVEL
>> has a strong emphasis on maintaining interpreted-mode performance.
>>
>> MVEL contains two runtime systems: an interpreter, and a compiler/ 
>> runtime.
>> Unlike other ELs, MVEL does not simply bootstrap the compiler, and  
>> execute
>> that way.  Instead, MVEL has a real-time interpreter which evaluates  
>> to a
>> stack during parsing.  Therefore, the general design decisions,  
>> particularly
>> around extendability tend to favor singleton-patterns, instead of
>> heavyweight configuration sessions which would completely bog down the
>> performance.
>>
>> http://artexpressive.blogspot.com/2007/11/juel-vs-mvel.html
>>
>> For an example of how performant MVEL's interpreter is with no factory
>> caching.
>>
>> In a simple property expression, with no caching (so parsing before
>> executing every time), MVEL was able to parse/reduce the expression
>> "foo.bar" 100,000 times in 94ms.  It took JUEL 2749ms to do the same.
>>
>> Compiled performance was: 5.8ms to 34.2ms in favor of MVEL too.
>>
>> So I would err on the side of performance here.  If that doesn't cut  
>> it for
>> web applications, I guess that's fine.  I don't really target MVEL  
>> towards
>> web applications, really.
>>
>>
>>
>> Brian Pontarelli wrote:
>>>
>>> Taking a brief look at the MVEL type conversion API it could be
>>> somewhat difficult to get this information into the converter on a  
>>> per
>>> request basis, especially if converters are singleton scoped. This
>>> information isn't available on the source in most cases. It is  
>>> usually
>>> externalized in the request or the container object. The API looks a
>>> pretty lightweight, which is nice, but also restrictive. From what I
>>> could see I would have to monkey around with things and use something
>>> like a ThreadLocal to pass this information to the converter.
>>>
>>> The source-from-many pattern seems to be somewhat backwards for the
>>> web. It is more likely the case that a single converter will convert
>>> to many classes from a String or String[]. The JCatapult type
>>> converter passes in the type being converted to and then the String
>>> value(s). Although this is very web centric, it cleans up the API and
>>> makes things simpler to implement. MVEL is obviously more generic,
>>> which means some massaging is necessary to tune it for the web.
>>>
>>> It also seems to be lacking a good set of exceptions thrown out of  
>>> the
>>> API. At least from the docs, since I couldn't find JavaDoc and the
>>> distribution only has source (ouch). This doesn't mean that Struts
>>> can't provide good runtime exceptions and then just catch those, but
>>> it leaves things much more open for developers writing new  
>>> converters.
>>> I'd rather see the API define these exceptions clearly and for them  
>>> to
>>> be checked.
>>>
>>> I think that using generic languages like OGNL or MVEL are decent
>>> solutions, but a web centric solution would be best. I'm also in  
>>> favor
>>> or dropping most if not all of the extra features and only providing
>>> property/field getting and setting. I think adding in another  
>>> language
>>> just clouds the waters. FreeMarker and JSP both have languages that
>>> cover most of the common cases.
>>>
>>> Feel free to take a look at the JCatapult MVC expression evaluator  
>>> for
>>> what I feel should be supported.
>>>
>>> -bp
>>>
>>>
>>> On Oct 11, 2008, at 12:52 PM, Chris Brock wrote:
>>>
>>>>
>>>> MVEL has a pluggable type-conversion API, just like OGNL.  Since  
>>>> it's
>>>> source-from-many in it's design, you can easily design converters  
>>>> that
>>>> perform as much introspection as necessary to determine formatting,
>>>> etc.
>>>>
>>>>
>>>>
>>>> Brian Pontarelli wrote:
>>>>>
>>>>> Yeah. That's good. The last thing I would toss in as criteria is a
>>>>> good type conversion interface. In JCatapult, I actually took
>>>>> things a
>>>>> step further. I found that complex types usually needed more
>>>>> information than just the data to perform the type conversion. For
>>>>> example, conversion of dates generally requires the date format.
>>>>> Likewise, conversion to money generally requires the currency code.
>>>>> In
>>>>> many MVCs this information is statically configured for the entire
>>>>> application, configured per action in XML or properties files or
>>>>> fixed
>>>>> and not configurable at all.
>>>>>
>>>>> For maximum flexibility, I built a system where tags could provide
>>>>> this additional data via extra attributes (it can also be  
>>>>> configured
>>>>> application wide as well). My tags look like this:
>>>>>
>>>>> [EMAIL PROTECTED] name="user.lifeSavings" currencyCode="USD"/]
>>>>> [EMAIL PROTECTED] name="user.birthDay" dateTimeFormat="MM/dd/yyyy"/]
>>>>>
>>>>> This information then gets passed to the type converters as part of
>>>>> the API.
>>>>>
>>>>> This then reveals another shortcoming of OGNL and the wrapper in
>>>>> Struts, what if a required attribute is missing? This is a  
>>>>> different
>>>>> case then if the type conversion fails. So, I created two distinct
>>>>> checked exceptions to handle these two cases. This makes the type
>>>>> conversion system more powerful and easy to interact with. Plus, it
>>>>> reveals good exceptions for coding problems.
>>>>>
>>>>> -bp
>>>>>
>>>>> On Oct 10, 2008, at 3:00 AM, Chris Brock wrote:
>>>>>
>>>>>>
>>>>>> MVEL will handle type coercion for method parameters, properties,
>>>>>> and even on
>>>>>> egress of those values if the generic type information can be
>>>>>> deduced on
>>>>>> ingress.  In situtations where the generic type is dependent on  
>>>>>> the
>>>>>> root of
>>>>>> the object graph though, MVEL cannot infer generic type data  
>>>>>> (ie. a
>>>>>> bound
>>>>>> variable, that's say a Map) because of erasure.  There is no  
>>>>>> generic
>>>>>> type
>>>>>> information held on a per-instance basis.
>>>>>>
>>>>>> However, if the parameterized type is a class member say:
>>>>>>
>>>>>> class Foo {
>>>>>> public Map<String, Integer> map;
>>>>>> }
>>>>>>
>>>>>> And you use an instance of Foo as a context or as a bound  
>>>>>> variable,
>>>>>> MVEL's
>>>>>> compiler can certainly extract the generic type information, and
>>>>>> provide
>>>>>> automatic coercion and verification accordingly.  MVEL's type
>>>>>> verifier will
>>>>>> always extrapolate whatever type data is available.
>>>>>>
>>>>>>
>>>>>>
>>>>>> Brian Pontarelli wrote:
>>>>>>>
>>>>>>> This is not quite the same unless it can detect generics while
>>>>>>> setting
>>>>>>> values and creating values. An example might be values from a  
>>>>>>> form
>>>>>>> going into something like:
>>>>>>>
>>>>>>>         List<String>
>>>>>>>
>>>>>>> or
>>>>>>>
>>>>>>>         Map<String, List<Integer>>
>>>>>>>
>>>>>>> or the always fun
>>>>>>>
>>>>>>>         List<List<Integer>>
>>>>>>>
>>>>>>> that sorta thing. I know that OGNL had (might not any longer)  
>>>>>>> many
>>>>>>> issues with generics in this respect. I think OGNL also got mad
>>>>>>> when
>>>>>>> it encountered something simple like:
>>>>>>>
>>>>>>>         int[]
>>>>>>>
>>>>>>> or
>>>>>>>
>>>>>>>         String[]
>>>>>>>
>>>>>>> coming from checkbox lists and multiple selects. I believe that  
>>>>>>> it
>>>>>>> would stuff the values into the String[] like this:
>>>>>>>
>>>>>>>         {"value1,value2,value3"}
>>>>>>>
>>>>>>> rather than
>>>>>>>
>>>>>>>         {"value1", "value2", "value3"}
>>>>>>>
>>>>>>> This was a while ago, so all of this might be fixed.
>>>>>>>
>>>>>>> -bp
>>>>>>>
>>>>>>>
>>>>>>> On Oct 9, 2008, at 7:32 PM, Chris Brock wrote:
>>>>>>>
>>>>>>>>
>>>>>>>> MVEL 2.0 has full support for generics (and static typing):
>>>>>>>> http://mvel.codehaus.org/Strong+Typing+Mode
>>>>>>>>
>>>>>>>>
>>>>>>>> Brian Pontarelli wrote:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Oct 7, 2008, at 3:08 PM, Dave Newton wrote:
>>>>>>>>>
>>>>>>>>>> Just to muddy the EL/templating waters:
>>>>>>>>>>
>>>>>>>>>> http://mvel.codehaus.org/Performance+of+MVEL
>>>>>>>>>>
>>>>>>>>>> (v. OGNL)
>>>>>>>>>
>>>>>>>>> Not sure about MVEL or OGNL at this point, but everything was
>>>>>>>>> lacking
>>>>>>>>> in support for generics, collections and arrays. I wrote my own
>>>>>>>>> for
>>>>>>>>> the JCatapult MVC and it was really not all that hard. It only
>>>>>>>>> handles
>>>>>>>>> getting and setting, but I figure that's all that should be
>>>>>>>>> allowed
>>>>>>>>> at
>>>>>>>>> that point anyways.
>>>>>>>>>
>>>>>>>>> -bp
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>>>>>>>>> For additional commands, e-mail: [EMAIL PROTECTED]
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>> -- 
>>>>>>>> View this message in context:
>>>>>>>> http://www.nabble.com/MVEL--tp19867360p19910418.html
>>>>>>>> Sent from the Struts - Dev mailing list archive at Nabble.com.
>>>>>>>>
>>>>>>>>
>>>>>>>> ---------------------------------------------------------------------
>>>>>>>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>>>>>>>> For additional commands, e-mail: [EMAIL PROTECTED]
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> ---------------------------------------------------------------------
>>>>>>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>>>>>>> For additional commands, e-mail: [EMAIL PROTECTED]
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>> -- 
>>>>>> View this message in context:
>>>>>> http://www.nabble.com/MVEL--tp19867360p19914597.html
>>>>>> Sent from the Struts - Dev mailing list archive at Nabble.com.
>>>>>>
>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>>>>>> For additional commands, e-mail: [EMAIL PROTECTED]
>>>>>>
>>>>>
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>>>>> For additional commands, e-mail: [EMAIL PROTECTED]
>>>>>
>>>>>
>>>>>
>>>> -- 
>>>> View this message in context:
>>>> http://www.nabble.com/MVEL--tp19867360p19935345.html
>>>> Sent from the Struts - Dev mailing list archive at Nabble.com.
>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>>>> For additional commands, e-mail: [EMAIL PROTECTED]
>>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>>> For additional commands, e-mail: [EMAIL PROTECTED]
>>>
>>>
>>>
>> -- 
>> View this message in context:
>> http://www.nabble.com/MVEL--tp19867360p19936453.html
>> Sent from the Struts - Dev mailing list archive at Nabble.com.
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> For additional commands, e-mail: [EMAIL PROTECTED]
>>
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 
> 
-- 
View this message in context: 
http://www.nabble.com/MVEL--tp19867360p19943987.html
Sent from the Struts - Dev mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to