I've been giving this topic considerable thought for
the last month. Now that JSTL is getting close to
official release, performance may become a bigger
issue.

I've been evaluating JSTL and experimenting with using
it for complex rendering logic. From what I've seen,
the common pattern of usage tends to have a limited
number of tags, with a few tags use repeatedly.  As
denis pointed out, the performance would improve,
though one other benefit is improved reliability.

In my early benchmarks with JMeter and JProbe, deeply
nested try/catch statements results in excessive GC,
which kills reliability and performance. The work
Denis and Kin-man did recently has improved
performance dramatically for pages with lots of tags.
I have noticed on long tests that memory usage slowly
creeps up until I get "out of memory error".

reusing tags probably won't improve performance by
2-4x, but it should make deployments with JSTL tags
more stable. 

--- Denis Benoit <[EMAIL PROTECTED]> wrote:
> On Fri, 24 May 2002, Kin-Man Chung wrote:
> 
> Like Costin, I don't think that there would be much
> performance penalty
> by calling a private method.  In fact, if we want to
> reduce the number
> of "unnecessary" calls, I have another idea...  well
> I have two ideas,
> one of which is not related to the 64 K limit.
> 
> 1. In the generated page, there is a lot of
> consecutive:
> 
>       out.write("some string");
>       out.write("another string");
>       and so on.
> 
>    Why don't we merge all these consecutive strings
> together?
> 
>       out.write("some string\nanother string");
> 
>    it would greatly reduce the number of write()
> calls.  So it would
>    contribute, in a limited way to reduce the size
> of the _jsp_service()
>    method.  It would be sligthly faster, which is
> not bad :) by reducing
>    the number of method calls.
I'm no expert on JSPTag specs, but a common pattern in
JSTL is the following:
<c:set ..>
 <c:choose>
  <c:when test="${some_state}"/><c:out
value="my_value"/></c:when>
  ....
 </c:choose>
</c:set>

Would the jsp page compilation make the distinction
between <c:out ...> which print out a value and one
that is used in a variable? 

> 
> 2. This one has nothing to do with the size, it's
> just something that I think
>    we should plan for: tag reuse.  Some of the pages
> that have a lot of tags,
>    do so because they have them in an HTML table.  A
> "big" page can reference 
>    80 or so tags, but these tags can represent only
> four or five distinct
>    types.  It is not so difficult to find 80 tags in
> a page, but it would be
>    difficult to find one with 80 _distinct_ tag
> classes!  Most of these tags
>    could be reused, that is we often call:
> 
>       tag1 = new SomeTag();
>       tag1.doStartTag();
>       tag1.doEndTag();
>       tag1.release();
>       tag2 = new SomeTag();
>       tag2.doStartTag();
>       tag2.doEndTag();
>       tag2.release();
> 
>   There is no real reason to create a new tag for
> tag2, it could have
>   been replaced by:
> 
>       tag1 = new SomeTag();
>       tag1.doStartTag();
>       tag1.doEndTag();
>       tag1.doStartTag();
>       tag1.doEndTag();
>       tag1.release();
> 
>    Here is the relevant section of the JSP specs (I
> know Kin-Man, you don't need
>    a reminder, but others might :):
> 
>       "public void release()
>        Called on a Tag handler to release state. The page
> compiler guarantees
>        that JSP page implementation objects will invoke
> this method on all tag
>        handlers, but there may be multiple invocations on
> doStartTag and
>        doEndTag in between."
> 
>   So, the specs seem to imply that tag reuse is
> allowed.
> 
> Now, why do I brought about this second point, if it
> is not relevant to the 64K
> limit?  Just that whatever the solution we'll take
> to address the issue, it
> should not make tag reuse impossible.  I agree with
> Kin-Man, Tag will take more
> importance in the future of JSP pages.  So we must
> take whatever measures to
> optimize them.  Most tags won't see a big
> performance boost from reuse, but some
> tags can be pretty hefty, and for them, tag reuse
> can be a big factor.
> 
> Now, there were two approach to the "64K problem". 
> Kin-Man proposed creating
> methods for each custom tags, and Costin proposed a
> state machine.  I tend to
> agree with Kin-Man for one account, at the current
> state of the compiler,
> Kin-Man's method could be done faster.  I don't
> think we should throw away
> the "state machine" implementation, but I see it
> more as a Jasper 3 / Tomcat 5
> thing :)  At that time, it could be further
> investigated the benefits and
> penalties of this approach.  But if we choose to
> delegate each tag to a method,
> I think it would be important to leave the door open
> to tag reuse, that is if we
> do not implement it at the same time.
> 
> Comments?
> 
> -- 
> Denis Benoit
> [EMAIL PROTECTED]
> 

Looking at the work on jasper recently and comparing
it to the older tag pooling in 3.3, I lean towards
using the state machine idea. Though it also has a
limit for high concurrency, but those situations
really should go with a non-tag solution to reduce
overhead.

peter lin


__________________________________________________
Do You Yahoo!?
Yahoo! - Official partner of 2002 FIFA World Cup
http://fifaworldcup.yahoo.com

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

Reply via email to