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
•