I actually tried to do this really quickly earlier.  I didn't have time to
figure it out, as your EL stuff has dependencies on HttpServletRequest and
outward dependencies to your framework.  I tried to check-out everything,
but SVN kept dying while checking out (I think Google's SVN server was
acting up).

One of the problems of trying to do a simple performance test with your
stuff is that (like you say) it's not generic, and a bit of a pain in the
butt to test in isolation.  


Brian Pontarelli wrote:
> 
> 
> We could do that if you like. Those are pretty simple numbers with  
> very straight-forward cases. So, please run those against MVEL and let  
> me know what you get. StringTokenizer is obviously quite fast, and I  
> could easily remove it if it would mean sub-millisecond times,  
> although the work probably isn't worth the effort with such small  
> numbers.
> 
> Just create three classes:
> 
> An action
> A user object
> An address object
> 
> The action has a user and the user has a generic Map of addresses  
> keyed off a String. This should work:
> 
> public class Action
>    public User user;
> }
> 
> public class User {
>    public int age;
>    public Map<String, Address> addresses;
> }
> 
> public class Address {
>    public String zipcode;
> }
> 
> Then, just get and set some values without any pre-compile or caching  
> and let me know what the times are. My guess is that you will be  
> slightly slower or the same. To get truly accurate, we might have to  
> go sub-millisecond or create some more dramatic tests.
> 
> Also, I doubt that StringTokenizer is impacting my performance any. In  
> fact the numbers clearly state otherwise. Besides, with things  
> happening sub-millisecond or just above that, I just don't see any  
> benefit in spending a lot of time making it faster.
> 
> -bp
> 
> 
> 
> On Oct 12, 2008, at 11:46 AM, Chris Brock wrote:
> 
>>
>> 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]
>>
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 
> 
-- 
View this message in context: 
http://www.nabble.com/MVEL--tp19867360p19947349.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