Problem: 
Large lists of objects are iterated pointlessly for
most uses of display tag.  Except for on the first
iteration, the CulumnTag methods do almost nothing if
you specify the property for a column.  Most of the
time and empty cell is added toa  Row and the Row
added to the Table Model.  However, adding a row to
the table is unnecesary for most purposes, as we shall
see.  The typically unncessary iterations result in
numerous method calls that dramatically hurt
performance.

The sample paging jsp's only use a few columns--about
4.  If you add a colum the number of additional method
calls is multiplied by the number of rows for each
column.  Add 8 columns and a simple paging example
that displays only 10 rows of a list of 2000 can take
over 2 seconds of iteration time and then only 15-30
millis of real work in the TableTag doEndTag method. 
This makes the run time of display tag exponential.  


Solution:
I wanted to skip the iterations and do only the work
required.  I was able to do this and get the time to
nearly O(1), on non sorts.  (There is still some
iteration on building the partial list, so it is
probably really O(N), but that iteration is
negligible.  Sorting is merge sort time. )

To do this I did a couple of things.  

1.  If the pageSize is greater than zero, I return
SKIP_BODY from TableTag doAfterBody.  I did it here to
let the first colum iteration take place for building
header.  (The condition to skip should take into
account more options, however.)

2.  I pass the original list of data to TableModel. 
Then, if there is paging, in getViewable data of
TableTag, I build up the rows of the TableModel that I
want to use based on what is left of the orignal list
after pulling out the chunk for the page.  

3. If there is a sort, I made the RowSorter
Implementation able to handle any object and not just
a Row, so I can pass it the original list and not the
Row wrapped list.  This was easy.  I just set object1
= obj1 (the method param).  The ability to do this is
key, since it makes the initial iteration largely
unnecessary.  

Also, with the RowSorter enhancement, I was able to
skip decoration for sorts.  Another great boost.


Result: 
With the plugable RowSorter enhancement and the
runSimple changes I was able to sort without
reflection.  The total work takes about 16-30 millis
for a list of 2000 items with 8 columns, whereas
before it took 2 1/2 seconds.  

This makes display tag usable for very large result
sets.

I'm not sure what features will be unavailable with
this enhancement.  My proposed option should be
configurable by setting a property like runSimple=true
or something on the table.  Also the condition to
skip_body should take into account more that just
whether or not the list can be paged.

I may have left out a few details, but it works great
for probably 99% of what anyone will do with the
library.  It should be an option to runSimple or
something similar, since you can get a 200X
performance boost at modest conditions.

I'll submit patches if there are no obvious drawbacks.

Cheers,

Aaron Smuts
http://jakarta.apache.org/turbine/jcs/



        
                
__________________________________
Do you Yahoo!?
Friends.  Fun.  Try the all-new Yahoo! Messenger.
http://messenger.yahoo.com/ 


-------------------------------------------------------
This SF.Net email is sponsored by: Oracle 10g
Get certified on the hottest thing ever to hit the market... Oracle 10g. 
Take an Oracle 10g class now, and we'll give you the exam FREE.
http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click
_______________________________________________
displaytag-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/displaytag-devel

Reply via email to