Closed
Bug 1227689
Opened 9 years ago
Closed 9 years ago
Scalability: opening or closing a single tab takes Ω(n) time
Categories
(Firefox :: Untriaged, defect)
Tracking
()
RESOLVED
DUPLICATE
of bug 816784
People
(Reporter: baldauf--2015--bugzilla.mozilla.org, Unassigned)
Details
User Agent: Mozilla/5.0 (X11; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0 SeaMonkey/2.39 Build ID: 2015110400 Steps to reproduce: Each time a tab is closed (or an empty tab's document is replaced by a different document due to the user navigating), a WindowDestroyedEvent is created. When handling the WindowDestroyedEvent, method js::NukeCrossCompartmentWrappers() is called (see http://hg.mozilla.org/releases/mozilla-release/annotate/6fd87bafc499/dom/base/nsGlobalWindow.cpp#l9214 ) This method iterates over all compartments (that effectively means: all tabs), and for each interesting compartments, it iterates over all wrappers in that compartment (see http://hg.mozilla.org/releases/mozilla-release/annotate/6fd87bafc499/js/src/proxy/CrossCompartmentWrapper.cpp#l451 ) So effectively, opening or closing one tab takes Ω(n) time. An action where all tabs are opened (e.g. during session restore) thus takes Ω(n²) time. Thus, the current firefox does not scale, while it should. Actual results: See these stack traces: When a tab is closed, then this happens: nsGlobalWindow::NotifyWindowIDDestroyed dom/base/nsGlobalWindow.cpp:9234 nsGlobalWindow::FreeInnerObjects dom/base/nsGlobalWindow.cpp:1632 nsGlobalWindow::DetachFromDocShell dom/base/nsGlobalWindow.cpp:2897 nsDocShell::Destroy docshell/base/nsDocShell.cpp:5715 nsFrameLoader::DestroyDocShell dom/base/nsFrameLoader.cpp:1473 nsFrameLoaderDestroyRunnable::Run dom/base/nsFrameLoader.cpp:1411 When a tab is opened, then this happens: nsGlobalWindow::NotifyWindowIDDestroyed dom/base/nsGlobalWindow.cpp:9234 nsGlobalWindow::FreeInnerObjects dom/base/nsGlobalWindow.cpp:1632 nsGlobalWindow::SetNewDocument dom/base/nsGlobalWindow.cpp:2558 nsDocumentViewer::InitInternal layout/base/nsDocumentViewer.cpp:881 nsDocumentViewer::Init layout/base/nsDocumentViewer.cpp:621 nsDocShell::SetupNewViewer docshell/base/nsDocShell.cpp:9167 nsDocShell::Embed docshell/base/nsDocShell.cpp:7068 nsDocShell::CreateContentViewer docshell/base/nsDocShell.cpp:8975 nsDSURIContentListener::DoContent docshell/base/nsDSURIContentListener.cpp:129 nsDocumentOpenInfo::TryContentListener uriloader/base/nsURILoader.cpp:725 nsDocumentOpenInfo::DispatchContent uriloader/base/nsURILoader.cpp:398 nsDocumentOpenInfo::OnStartRequest uriloader/base/nsURILoader.cpp:259 nsBaseChannel::OnStartRequest netwerk/base/nsBaseChannel.cpp:784 In both cases, a WindowDestroyedEvent is created (see http://hg.mozilla.org/releases/mozilla-release/annotate/6fd87bafc499/dom/base/nsGlobalWindow.cpp#l9234) Expected results: Opening or closing one tab should take O(1) time, not O(n) time. Maybe this can be achieved by keeping the wrappers even if their destination object does not exist anymore. At least, restoring a session should take O(n) time, not O(n²) time.
Comment 1•9 years ago
|
||
This is very similar to Bug 816784.
Status: UNCONFIRMED → RESOLVED
Closed: 9 years ago
Resolution: --- → DUPLICATE
You need to log in
before you can comment on or make changes to this bug.
Description
•