Closed Bug 55413 Opened 24 years ago Closed 24 years ago

5 load listeners registered when one could do

Categories

(SeaMonkey :: UI Design, defect, P1)

defect

Tracking

(Not tracked)

VERIFIED FIXED

People

(Reporter: hjtoi-bugzilla, Assigned: matt)

Details

(Keywords: perf, Whiteboard: [rtm++]Fix in hand (fixed on branch 10/13))

This grew out of bug 51211.

In navigator.js, event listeners are added to respond to page load events:
contentArea.addEventListener("load", UpdateBookmarksLastVisitedDate, true);
contentArea.addEventListener("load", UpdateInternetSearchResults, true);
contentArea.addEventListener("load", checkForDirectoryListing, true);
contentArea.addEventListener("load", getContentAreaFrameCount, true);
contentArea.addEventListener("load", postURLToNativeWidget, true);

------- Additional Comments From Adam Lock 2000-09-22 11:38 -------

It strikes me as very inefficient to register 5 javascript handlers for the same
load event. That means five entries, five JS stubs, five marshalled calls.
Shouldn't navigator.js just register one handler and call these 5 methods from
there?

------- Additional Comments From Heikki Toivonen 2000-09-22 18:04 -------

The second patch is to navigator.js. It moves all the load event handlers into a
new function which is now the only registered event listener. I do not have the
stats yet how much this saves in time.

I also added the filter Tim Hill suggested. It does indeed filter out the frame
load events (I presume) as well. For example, I put a counter to see how many
events were filtered and on http://developer.netscape.com we filter two events.
However, I do not know if this is safe. Anyone know if the functions in
question would in fact be interested in frame loads as well?


------- Additional Comments From law@netscape.com 2000-09-22 18:46 -------

Might you have subtly changed the behavior if one of the previous handlers does
something like generate a JS exception?  Previously that would ripple back to
the event listener calling code which would (theoretically?) go ahead and call
the next listener.  Now, that would ripple back for the one listener call and
other pseudo listeners wouldn't get a crack at the load event.

That probably doesn't matter, but perhaps a try/catch around each handler call
would be safer?

Also, can you go ahead and pass the event into the 3 listeners that don't use
it?  That would match the semantics of the call currently being made to the load
listeners, right?


------- Additional Comments From Heikki Toivonen 2000-09-22 19:25 -------

Hmm, didn't think about exceptions... That's what you get for coding too long in
our subset of C++ features to use... And XUL isn't my area, really.

Well, it seems unlikely that any of the methods would throw anything except
under extreme situations (like out of memory condition). These methods have
internal try/catch code to catch normal cases. It would be nice get some data on
the speed gain before going forward with this... My Quantify refuses to
cooperate, though :(

I don't see the benefit of passing the event into the methods that don't use it.
It is a minor optimization, but still. And does JavaScript running in strict
mode then give warnings about unused parameters?


------- Additional Comments From Heikki Toivonen 2000-09-22 19:31 -------

This is just speculation, but it seems likely that adding try/catch around each
call would emulate the current model even in low memory condition because we do
a pretty good job in forgetting to check return values from functions. I cannot
be totally sure about this, of course. But then again, how expensive is the
try/catch code, would we lose the speed gain in the extra try/catch code?


------- Additional Comments From Heikki Toivonen 2000-10-02 18:44 -------

3. We could gain some performance boost by registering only one load event
listener which would then call the real load event listeners. According to
vidur's gut feeling the gain would be insignificant, vidur thinks that 10 or so
event listeners would benefit from moving them into single event listener. But
there is not hard data on this! This has been addressed in the second patch. See
comments from me and law between 2000-09-22 18:04 and 2000-09-22 19:31. I see
some additional risk in this change.

The proposed patch (with some additional stuff) is:

http://bugzilla.mozilla.org/showattachment.cgi?attach_id=15371
Keywords: perf
Summary: 5 load listeners registered when one would do → 5 load listeners registered when one could do
Nominating for RTM as search is broken without this fix.
Keywords: rtm
Uh, how is search broken? This bug is only about the performance that could be 
gained by replacing the 5 separate load listeners with one load listener that 
would then call these 5 functions.
Robert sez, "Just try doing a search in Mozilla.  Sometimes you'll get each
search result duplicated several times, sometimes the results end up
disappearing... basically, its unusable."

This would be bad.  A major loss of functionality.  Matt, can you find out
what's going on here?
Assignee: don → matt
Priority: P3 → P1
Whiteboard: [rtm need info]
> Uh, how is search broken? This patch...

The proposed patch has the following line in it:
  if (event.target == window._content.document)
which helps prevent search results from reloading endlessly.

This was all covered in bug # 51211.
OK, rjc has nicely sent a patch.  Matt, can you review this and approve it?
Whiteboard: [rtm need info] → [rtm need info]Fix in hand
Please note that 51211 was broken into SEVERAL bugs. This bug is ONLY about the 
performance that could be gained by replacing the 5 load listeners with one. 
This is actually an ENHANCEMENT.

Bug 51211 was closed, and the fix was that image load event no longer travels to 
chrome. This should have fixed most of the problems with search panel. Update 
dom/src/base/nsGlobalWindow.cpp and see if the search is better...

Bug 55414 is about filtering also the frame load events. That is what

  if (event.target == window._content.document)

would be doing, and it should be handled in bug 55414.
I've been running this in my tree.  Seems fine and works fine.
sr=rjc

Looking for another reviewer.
As I implied in my previous critique of this patch, I have concerns that this
rewrite might change the semantics if one of the called handler functions raises
an exception.

That's probably not important, and I don't even know how the current
listener-calling code behaves.  So as not to be a party-pooper, I'll go ahead
and say "r=law" anyway.
I am still saying you are discussing the wrong thing in this bug. If search
results are reloading too many times, that is bug 55414.

This bug is only about the performance gained by replacing 5 event listeners
with one.
This is silly... both bugs are the same exact patch.

Let's get this fix checked in(!) instead of playing bugzilla games.
Yeah, it is the same patch (I did explain that the patch contains other stuff).
If the patch goes in as is, the other bug should be marked fixed as well. But it
is really two different bugs, and I was specifically asked by PDT to make
separate bugs. Two decisions need to be made. If the answer is yes on both bugs
I have no reasons to complain, other than that that wrong thing is being
discussed in this bug ;)
Fix in hand, reviewed and approved, so this is "rtm+".
Whiteboard: [rtm need info]Fix in hand → [rtm+]Fix in hand, reviewed and approved
Don't understand what's going on.  Is there a patch associated with this bug?
Also, how much of a performance improvement are we talking about?  Is this user
perceptable?  Marking need info
Whiteboard: [rtm+]Fix in hand, reviewed and approved → [rtm+ need info]Fix in hand, reviewed and approved
Patch:

http://bugzilla.mozilla.org/showattachment.cgi?attach_id=15371

Nobody has measured performance gain.

The patch also contains the proposed fix for bug 55414. It seems that frame
loads(?) are messign up the search sidebar, maybe something else as well.
PDT:  As Heikki alludes to with bug # 55414, internet searches are horked until 
this is fixed. 
Re-marking as "plus" now that the information is available.
Whiteboard: [rtm+ need info]Fix in hand, reviewed and approved → [rtm+]Fix in hand, reviewed and approved
The unquantified performance enhancement is certainly [rtm-]. However, it's
important that internet searching work, so marking [rtm++] for the absolute
minimum set of work which fixes search.
Whiteboard: [rtm+]Fix in hand, reviewed and approved → [rtm++]Fix in hand, reviewed and approved
fixed in branch.
monday will check into trunk.
updating status whiteboard to show that branch has been fixed
Whiteboard: [rtm++]Fix in hand, reviewed and approved → [rtm++]Fix in hand (fixed on branch 10/13)
Did this make it to the trunk, ever?

(I bet you can get away with the whole fix, though I'm not sure that registering
four additional load observers has any meaningful effect.)
Umm..what are we going to do here? This bug has been sitting at rtm++ for 8 days
now.
Oops
Got sidetracked.
I'll check this into the tree today.
fixed
Status: NEW → RESOLVED
Closed: 24 years ago
Resolution: --- → FIXED
rubberstamp vrfy from the branch perspective...
Keywords: vtrunk
...and a rubberstamp vrfy from the trunk pov.
Status: RESOLVED → VERIFIED
Keywords: vtrunk
Product: Core → Mozilla Application Suite
You need to log in before you can comment on or make changes to this bug.