Closed Bug 241599 Opened 20 years ago Closed 20 years ago

Table layout speedup

Categories

(Core :: Layout: Tables, enhancement)

enhancement
Not set
normal

Tracking

()

RESOLVED FIXED

People

(Reporter: jim_nance, Unassigned)

References

(Blocks 1 open bug, )

Details

(Keywords: perf)

Attachments

(5 files, 2 obsolete files)

I am still trying to make the table layout code faster for the table given in
the URL above (its bonsi output).  We seem to be spending a lot of time under
nsTableFrame::GetCellInfoAt() which is called by
BasicTableLayoutStrategy::AssignPctColumnWidths().

AssignPctColumnWidths() makes two passes over the table.  Once to handle columns
with a colspan of 1, and once to handle columns with a colspan>1. 
GetCellInfoAt() is called for every table element in both of those passes.  I
modified the code so that it records the minimum and maximum columns which have
a colspan>1, so that it only has to loop over this range in the second pass. 
For the table above, and probably many others, no colums have a colspan>1, so we
cut our calls in half.  Jprof shows how much this helps.  These runs consist of
loading the page referenced above 5 times.  The page was on the local FS to
remove network interactions.

Old:
                112 BasicTableLayoutStrategy::AssignPctColumnWidths(nsHTML
                110 GetSortedFrames(nsTableFrame*, int, int, CellInfo*)
                100 BasicTableLayoutStrategy::CalcPctAdjTableWidth(nsHTMLR
                 57 BasicTableLayoutStrategy::AssignNonPctColumnWidths(int
 70593   5      379 nsTableFrame::GetCellInfoAt(int, int, int*, int*)
                370 nsTableCellMap::GetCellInfoAt(int, int, int*, int*)
                  2 nsCellMap::GetCellInfoAt(nsTableCellMap&, int, int, in
                  1 nsTableFrame::GetCellMap() const
                  1 nsSplittableFrame::GetFirstInFlow() const


New:

                 98 BasicTableLayoutStrategy::CalcPctAdjTableWidth(nsHTMLR
                 53 GetSortedFrames(nsTableFrame*, int, int, CellInfo*)
                 50 BasicTableLayoutStrategy::AssignNonPctColumnWidths(int
                 46 BasicTableLayoutStrategy::AssignPctColumnWidths(nsHTML
 70664   8      247 nsTableFrame::GetCellInfoAt(int, int, int*, int*)
                238 nsTableCellMap::GetCellInfoAt(int, int, int*, int*)
                  1 nsCellMap::GetCellInfoAt(nsTableCellMap&, int, int, in
Another way to accomplish this would be to create a list of columns with
colspan>1 when we did the first loop.  It could be faster, but it is also more
complex as we would have to potentially allocate memory to hold the list.  If
someone thinks its better to make the list, I am willing to code it up.
I think the table cell map would be a better place to hold this list. We have
already a function that does that nsCellMap::ColHasSpanningCells but it is slow
as it looks up the cell data in the cellmap every time  it is called.
Look for comparison at nsTableCellMap::ColIsSpannedInto(PRInt32 aColIndex).
Speeding ColHasSpanningCells up in a similiar way like ColIsSpannedInto would
also speed up the other callers.
Could you please attach the jprof, I am just curious how it looks now.
by the way is that patch for review? If yes, could you be more explicit about it
(setting the flags).
The patch is not for review, I was interested in collecting comments first.  I
am currently implementing a version that makes a list so we can compare them.
Attached file prepatch jprof
Attached file post patch jprof
Keywords: perf
Attached patch New patch using list method (obsolete) — Splinter Review
Here is a patch implementing the same idea using a list built in the first
pass.  I like this a lot better.  It will provide speedups regardless of
whether the table has colspans or not.	And it make it so that we iterate
through the table only once, regardless of the number of spans.  We still do 3
passes, but we are only querying the elements once.  I used an arena so
building and tearing down the list should be light weight.  I would appreciate
comments, and if people like this I will request a review.  

There is one suggestion listed above for an alternate way to speed things up. 
I will look at doing that.  But I do not think it conflicts with this patch, so
I would like this included regardless of how the other one comes out
The original list patch had 2 bugs.  There was an uninitalized mPrev field in
the list, and I had changed the direction we looped through the rows, and that
broke some pages.
Attachment #147153 - Attachment is obsolete: true
Attachment #147278 - Flags: superreview?(bernd_mozilla)
Attachment #147278 - Flags: review?(bernd_mozilla)
Flags: blocking1.8a1?
Flags: blocking1.8a1?
the  patch doesnt compile on winxp VC6

e:/moz_src/mozilla/layout/html/table/src/BasicTableLayoutStrategy.cpp(1426) : er
ror C2106: '=' : Linker Operand muss ein L-Wert sein
e:/moz_src/mozilla/layout/html/table/src/BasicTableLayoutStrategy.cpp(1512) : er
ror C2106: '=' : Linker Operand muss ein L-Wert sein
make: *** [BasicTableLayoutStrategy.obj] Error 2
It dies in
 
PL_ARENA_ALLOCATE((void*)spanned, &spanArena, sizeof(*spanned));

Sorry Bernd, this one should compile.  I took a year of German in high school. 
Its fun to try and translate the error messages and see how much I remember!
Attachment #147278 - Attachment is obsolete: true
Attachment #152357 - Flags: superreview?(dbaron)
Attachment #152357 - Flags: review+
Attachment #147278 - Flags: superreview?(bernd_mozilla)
Attachment #147278 - Flags: review?(bernd_mozilla)
Comment on attachment 152357 [details] [diff] [review]
Fix the PL_ARENA_ALLOCATE problem

sr=dbaron, although I'm not sure a struct inside a function will work with all
our compilers.
Attachment #152357 - Flags: superreview?(dbaron) → superreview+
Checked in
Status: NEW → RESOLVED
Closed: 20 years ago
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: