Hi ,

That may explain a lot why the performance of the my application slow
down a lot recently.
But anyway , is there any plan to improve the performance of OGNL ,
since Tapestry 4.0 already released?

On 3/26/06, Adam Zimowski <[EMAIL PROTECTED]> wrote:
> Hi Andreas,
>
> FYI, OGNL is one of the biggest bottlencecks in Tapestry. I'm learning
> about it from performance testing my own app, but I could not say it
> better than what Patrick explained a while back on this list. His post
> was regarding Tap 3.0.3, but from my Tap4 tests, the OGNL performance
> is still very much a case for performance tweaks. In short, try to
> limit your OGNL usage to what's absolutely necessary, and do the rest
> in plain Java. My app is growing large very quickly, but I'm able to
> keep OGNL down to simple one-dot expressions.
>
> Perhaps you've seen Patrick's post (it's really well explained), but
> I'm including it here:
> -------------------------------------------------------------------------
>
> From: Patrick Casey <[EMAIL PROTECTED]>     Mailed-By: jakarta.apache.org
> Reply-To: Tapestry users <tapestry-user@jakarta.apache.org>
> To: Tapestry users <tapestry-user@jakarta.apache.org>
> Date: Feb 15, 2006 11:38 AM
> Subject: RE: Optimization Questions
>
> The last time I did a serious performance attach on a Tapestry 3.0.3
> app, by far the biggest performance bottleneck was the demon OGNL. Howard
> and I went round and round on that one, but the upshot is that Howard's
> using OGNL right, and OGNL is actually a decent reflection package (and
> hence faster than, say, Apache PropUtils), but it's still not native code.
>
>        Given that some page renders can require literally thousands of OGNL
> calls (I was up at like 1800 distinct evaluations for one page), its often
> the bottleneck.
>
>        I've pasted my OGNL performance hints below. None of it's rocket
> science, but aggressively following these techniques knocked about 50% off
> the page render time on my forms, so there's some serious performance to be
> gained.
>
>        --- Pat
>
>    Rules to Make OGNL Run Faster:
>
>
> **Dot Pruning:
>
> Reduce the number of "dots" in your calls. For example, lets say you had a
> call that read: "ognl:foo.bar.dog". That's a three-hopper as far as OGNL is
> concerned, requiring three times the work of a one hopper like "ognl:dog".
> You can make the thing run 3X as fast if your go into your page class and
> create a getter and setter for "dog" e.g.
>
>
>
> Public String getDog() {
>
>            Foo foo = getFoo();
>
>            If (foo == null)
>
>                        Return null;
>
>            Bar bar = getBar();
>
>            If (bar == null)
>
>                        Return null;
>
>            Return bar.getDog();
>
> }
>
>
>
> Public void setDog(String value) {
>
>            Foo foo = getFoo();
>
>            If (foo == null)
>
>                        Return;
>
>            Bar bar = getBar();
>
>            If (bar == null)
>
>                        Return;
>
>            Bar.setDog(value);
>
> }
>
>
>
>            What we've done is created two java stub classes that do 2/3 of
> the work for OGNL so it only has to make one "hop" to get at the methods it
> needs. Net result is it'll run 3X as fast.
>
>
> **Be Static:
>
>
>            OGNL isn't smart enough to realize that a reference to a public
> static final object is, in fact, static. It resolves the whole thing via
> inspection each time. So if you want to make an expression that reads, for
> example:
>
>
>
> <span jwcid="@Insert" value="ognl:@[EMAIL PROTECTED]" />
>
>
>            It's faster to do:
>
>
>            <span jwcid="@Insert" value="Monday" />
>
>
>            You're kind of Sol if you change "Monday" to "Mon" mind you, so
> I wouldn't switch over to literals like this until rollout time, but it does
> make a difference.
>
>
> **Avoid Putting Components Inside Foreach:
>
> There's a lot of OGNL grinding going on behind the scenes to support a
> foreach, and even more ognl grinding going on to call a component. So if you
> put the one inside the other, well, CPU cycles burn. So in many cases:
>
>
>
> <span jwcid="@Foreach" source="ognl:listOfDogs" values="ognl:currentDog">
>        <span jwcid="@DogDisplay" dog="ognl:currentDog"/>
>  <span>
>
>
> Is *dramatically* slower than moving the foreach down into the DogDisplay
> component e.g.
>
> <span jwcid="@ListOfDogsDisplay" listOfDogs="ognl:listOfDogs" />
>
>
> And then combing the foreach and the dogdisplay logic inside of one
> component. Otherwise every time the sub component gets called there's at
> least one ognl set/get pair being executed to push data into the component
> and pluck it out again. Basically pretend you're working in a system which
> has *really* inefficient method call overhead and view components as
> methods. Then optimize to reduce method calls.
>
> **Notes:
>
> If you do your own profiling, one warning I do want to give is that on
> JProfiler at least, it can "hide" the true culprit in the bowels of the call
> stack. So if you have an ognl expression that reads
> "ognl:foo.bar.thisMethodTakesForever", it'll show up as a lot of CPU time
> belonging to ognlGet until you dive into the call stack and get to
> whatever's at the pointy end of the get. Most of the time the actual get is
> trivial so all the time really is going into OGNL, but sometimes if you have
> expensive gets (or sets) it can make OGNL look worse than it is.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>

Reply via email to