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]>