On Fri, 24 May 2002, Kin-Man Chung wrote:

> My proposal to solving this problem is to generate codes for a tag
> handler (including its body) to a separate method.  This is only feasible
> if the tag action element and its body does not include any scripting
> elements.  The current trend (in the coming JSP1.3) seems to be moving
> to scriptless pages, so this is not as restrictive as it appears.
> 
> I don't have a detailed design yet for Generator, but I don't see any
> obvious problems.  The recent change in flattening out the try/catch
> blocks complicates things a little, but they are manageable.
> 
> There is obviously some performance trade-offs.  I really don't like

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.

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]


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

Reply via email to