Closed
Bug 29249
Opened 25 years ago
Closed 17 years ago
49 dlls loaded on startup: 50% of startup time
Categories
(Core :: XPCOM, defect, P4)
Core
XPCOM
Tracking
()
RESOLVED
INVALID
mozilla1.2alpha
People
(Reporter: dp, Unassigned)
References
Details
(Keywords: topperf, Whiteboard: [nav+perf])
Attachments
(3 files)
493 bytes,
patch
|
Details | Diff | Splinter Review | |
870 bytes,
patch
|
Details | Diff | Splinter Review | |
42.82 KB,
text/html
|
Details |
Here is the list of dlls in the order in which they get loaded. We have two
objectives:
1. Reduce the number of dlls loaded by removing code that caused dlls not
required at startup
2. Combine dlls if that causes a performance improvement.
I am primarily focussing on (1) reduce dlls loaded from this list.
components\xpinstal.dll
components\jsloader.dll
components\appshell.dll
components\chardet.dll
components\uconv.dll
components\necko.dll
components\nkres.dll
components\nkfile.dll
components\mimetype.dll
components\ucharuti.dll
components\ucvlatin.dll
gkwidget.dll
components\rdf.dll
components\profile.dll
components\xppref32.dll
components\xpc3250.dll
components\nsprefm.dll
components\nkabout.dll
gkgfxwin.dll
gkweb.dll
gkplugin.dll
components\urildr.dll
components\history.dll
components\mork.dll
components\tbmb.dll
components\msgbase.dll
jsdom.dll
components\mozbrwsr.dll
components\oji.dll
components\chrome.dll
components\caps.dll
components\gkhtml.dll
components\gkparser.dll
components\ender.dll
components\msgcompo.dll
components\msgnews.dll
components\addrbook.dll
components\wallet.dll
components\gkview.dll
components\nslocale.dll
components\nsgif.dll
components\strres.dll
components\bookmark.dll
components\search.dll
components\xpiflash.dll
components\lwbrk.dll
components\nkhttp.dll
components\cookie.dll
components\nkcache.dll
Reporter | ||
Comment 1•25 years ago
|
||
11.5 secs out of 22 secs of startup is solely due to dll loading.
Summary: 49 dlls loaded on startup → 49 dlls loaded on startup: 50% of startup time
Reporter | ||
Comment 2•25 years ago
|
||
Ccing dveditz and ftang. Are there any xpinstall or intl that dont need to get
loaded or may be loaded lazily after the first page shows ?
Seth is already fixing msgcompose and msgnews being loaded.
Status: NEW → ASSIGNED
Priority: P3 → P1
Target Milestone: M14
Comment 3•25 years ago
|
||
**Check a commercial build -- this list is NOT all that gets loaded** (all I'll
say for fear of the paranoid marking yet another bug private)
xpinstall must get loaded, and in fact I went to some trouble making sure it's
the very FIRST component -- it's what checks to see if an install needs
completing and if autoreg needs to be done.
Later on it would need to be loaded before the first page load anyway because
it adds objects to the DOM namespace.
xpiflash could go two ways, either combined into the xpinstall library, or
delay the loading until some future time. Either way the version checking it
does shouldn't happen at startup. I'm not sure if this feature is actually
working for beta1, perhaps we can just not deliver it for now. CC'ing dougt
Comment 4•25 years ago
|
||
Comment 5•25 years ago
|
||
It would be good to determine what the overhead is for loading a dll. I suspect
we'd see some formula like:
dllLoadTime = fixedOverhead + m * dllSize + n * dllEntryPoints
With a little experimentation, we should be able to figure out m, n and the
fixed overhead. By reducing the number of dlls we can eliminate the overhead.
Maybe we can cull some entry points too if n is significant.
We need to also examine which dlls necessarily must go together -- i.e. most of
networking is needed at the same time (see bug 17031), editor, browser
components, etc. If we put too much in a dll, we end up spending time loading a
larger dll than we need. If we put too little in, then we end up with multiple
dll loads and more overhead.
Comment 6•25 years ago
|
||
Of course the values for overhead, m and n will differ per platform. Should we
compromise for build consistency or go for the custom solution? The latter
scares me since I just tracked down a problem that stemmed from libreg being
a static lib on Unix and shared on Mac and Win.
Reporter | ||
Comment 7•25 years ago
|
||
For putting dlls together, the order of dll loading is important. The list I
put in the buglist is the order in which dlls are loaded.
So it should be easy to make the decision of clubbing
components\necko.dll
components\nkres.dll
components\nkfile.dll
together as these get loaded one after another.
I would also like to not loaded anymore data than what would have been loaded
before the first window is being shown. So like if dll A and dll B are loaded
one after another but inbetween there is the toplevel window, then putting them
together would cause the toplevel window to show up later than before.
Reporter | ||
Updated•25 years ago
|
Target Milestone: M14 → M16
Reporter | ||
Comment 8•25 years ago
|
||
Warren did the dll aggregation for necko. Nisheeth has an excellent thread on
this on n.p.m.peformance. Ccing nisheeth. Can you add relevat information.
Comment 9•25 years ago
|
||
Can someone measure the startup time now that necko dlls have been combined and
see if the time is any better? (Ideally, do a profile before and after pulling
my friday evening changes.)
Yes, I agree with dp that combining the necko dlls is a no-brainer since they
all are needed to even load in the first bit of chrome, but measuring what
difference this has made in startup time will help us understand whether it's
worth doing this on a larger scale.
Comment 10•25 years ago
|
||
I've gone through the issues in the post to n.p.m.performance titled "Mozilla
Startup Time" and filed the bugs listed below on people who I thought could be
potential owners.
Nisheeth Ranjan wrote:
> Some questions that I could identify based on this analysis are:
>
> 1) The docshell initializes the global history service when it is
> created. This causes history.dll and mork.dll to get loaded. Can we
> defer global history initialization till after the browser window has
> shown up?
http://bugzilla.mozilla.org/show_bug.cgi?id=38607 assigned to waterson.
> 2) The JS environment (nsJSEnvirnoment) initializes LiveConnect() when
> it is created which causes oji.dll and gkplugin.dll to get loaded.
> Can LiveConnect() initialization be deferred?
http://bugzilla.mozilla.org/show_bug.cgi?id=18277 already existed.
> 3) When the chrome protocol handler is created to load navigator.xul,
> nsChromeRegistry::AddToCompositeDataSource() is called which loads the
> "user-skins.rdf", "user-locales.rdf", "all-locales.rdf",
> "all-packages.rdf" datasources. Each of these datasource loads is a
> synchronous load. Can these datasource loads be deferred. If not,
> can they be made asynchronous?
Hyatt said that this is not possible.
> 4) cookie.dll is currently loaded when the http protocol handler
> creates objects registered under the "http-startup-category"
> category. Can we change this so that cookie.dll is loaded after the
> browser window has shown up?
http://bugzilla.mozilla.org/show_bug.cgi?id=38612 assigned to valeski.
> 5) Can we defer wallet initialization till after the browser window
> has come up?
http://bugzilla.mozilla.org/show_bug.cgi?id=38611 assigned to morse.
> 6) For some reason, RDFServiceImpl::GetResource() cause msgimap.dll
> and msglocal.dll to get loaded. The call stack that causes both these
> dll loads is pasted below. We should probably not load msgimap.dll
> and msglocal.dll before the browser window has come up.
A bug for this is assigned to Scott Putterman already.
> 7) bookmark.dll, search.dll, and directry.dll all get loaded when
> datasource attributes with the corresponding "rdf:____" are
> encountered in navigator.xul while building a content model. Can we
> load these datasources up after the browser
> window has come up?
waterson said that it isn't a good idea to defer the loading of
bookmark.dll. http://bugzilla.mozilla.org/show_bug.cgi?id=29359 was
already assigned to waterson for search.dll. It seems like the decision
there was to load search.dll but defer actual searches till later. I've
filed a new bug for directry.dll
(http://bugzilla.mozilla.org/show_bug.cgi?id=38620) and assigned it to
waterson.
> 8) shistory.dll and psmglue.dll get loaded through xpconnect calls
made from script that executes when navigator.xul's > onload event
handler fires. Can we move the script that causes these dlls to get
loaded to another place so that these dlls > don't get loaded before the
browser window comes up?
shistory.dll: http://bugzilla.mozilla.org/show_bug.cgi?id=38621 assigned
to radha.
psmglue.dll: http://bugzilla.mozilla.org/show_bug.cgi?id=38622 assigned
to mstoltz.
Comment 11•25 years ago
|
||
Oops, this is Nisheeth on Troy's machine. The previous post was by me, not
Troy.
Comment 12•25 years ago
|
||
nsbeta2-. Would love to have this perf work for beta3
Whiteboard: [nsbeta2-]
Comment 13•24 years ago
|
||
One way to cut down on the number of dlls loaded at Mozilla startup would be to
preload some dlls at Windows startup. This should be an option during the
instalation.
"Should Mozilla preload some files at Windows startup? Yes/No"
Users who access Mozilla many times during a scession would see a net savings of
time (Maybe 5 seconds saved each time Mozilla is launched vs 5 seconds longer
Windows boot ONE time.)
Users who are concerned with system resources could still select NO.
Comment 14•24 years ago
|
||
Moving all current open XPCOM and XPCOM Registry bugs to rayw since dp is on
sabbatical. rayw is now default assignee for these components.
Assignee: dp → rayw
Status: ASSIGNED → NEW
Comment 15•24 years ago
|
||
A few questions:
Does this startup time include loading a page?
Should it include loading a page?
I assume that these DLLs have all been properly based to unique locations,
right?
If this needs to become my major priority, then so be it, but other teams are
likely to better understand dependencies within their own code. Once XPCOM
itself uses a single DLL, do we have any good tools to bring to bear on the
rest? I had a good one I wrote ages ago at a former company. I think writing
one again is superior to trying to do without, because you really need to
understand what is happening, and a list of dlls, or just trying to read all the
source code does not do justice at all to what is taking the time. It can be
related to lots of different things I wrote it using the win32 debug APIs. Is
that as good as any other platform I might use to create it?
Comment 16•24 years ago
|
||
This list fails to take into account Microsoft DLLs that are loaded, which may
cause a great impact, depending upon which are used.
Possibly the worst DLL being loaded, from a performance impact viewpoint, during
startup is winmm, which is apparently being brought in as a static dependancy
from nspr4.dll and gkwidget.dll. I believe this is probably a DLL that we only
should bring in dynamically in quite special circumstances.
As soon as I can get my hands back on the right tools, I'll figure out the exact
dependencies.
Comment 17•24 years ago
|
||
In gkwidget.dll, the static call that brings in winmm.dll is PlaySound.
Assuming this is the best method to call, a dynamic wrapper should be written
that causes the DLL to actually be loaded when the first sound plays.
In nspr4.dll, the static call that brings in winmm.dll is timeGetTime. There
ought to be a better way to get time than activate the whole multimedia
libraries and drivers. Can we find a substitute call?
Comment 18•24 years ago
|
||
One problem call is found in:
http://lxr.mozilla.org/seamonkey/source/nsprpub/pr/src/md/windows/ntinrval.c#75
It already has work-around code for when the dll is missing. Let's forget ever
calling it, and it can save significant startup time (after making PlaySound
dynamic, as well).
Comment 19•24 years ago
|
||
The second problem call is:
http://lxr.mozilla.org/seamonkey/source/widget/src/windows/nsSound.cpp#81
This could be replaced with a dynamic call to the library.
I will produce patches.
Comment 20•24 years ago
|
||
Added NSPR engineers (larryh,wtc) to the cc list.
Comment 21•24 years ago
|
||
Comment 22•24 years ago
|
||
Comment 23•24 years ago
|
||
I added patches to eliminate WINMM.DLL from the startup profile. This is only
a very small thing, but once when I developed a major app for another company,
this particular fix cut a huge percentage off of startup time on Windows 95.
Both patches must be in place before the win will occur. If memory serves me,
at the time, it was a huge win on win95 (millions of instructions less), and
less of a win on win nt. Obviously, preloaded DLLs could cancel the win
entirely.
I tested:
Mozilla runs with the 2 patches, with no visible breakage.
Mozilla no longer activates winmm and mmdrv and so on with this patch.
I did not test:
Can we still play sound?
Did we see a loss in time precision that cost us anything important?
This DLL is obviously just a drop in the bucket, and it will take quite a while
to really make an impact, but I request that anyone who reviews this who is
proficient in performance timings to see if it made a measurable result.
Comment 24•24 years ago
|
||
Removal of NSPR's dependency on winmm.dll is tracked as bug #42714.
Depends on: 42714
Comment 25•24 years ago
|
||
Adding pavlov on a guess because of the sound playing thing
Updated•24 years ago
|
Status: NEW → ASSIGNED
Comment 26•24 years ago
|
||
> loaded = true;
> HMODULE module = ::LoadLibrary("WINMM.DLL");
> if (!module)
> {
> play = (PLAY)::GetProcAddress(module, "PlaySoundA");
> }
should be: if (module) ?
Comment 28•24 years ago
|
||
M16 has been out for a while now, these bugs target milestones need to be
updated.
Comment 29•24 years ago
|
||
Yes, it should be if module.
As I said before, this could take a lot of time and coordination to seriously
attack the problem. It is not yet clear to me that I should drop all other
priorities and work on this full time for weeks. Changing to M20.
Target Milestone: M16 → M20
Comment 30•24 years ago
|
||
Updated•24 years ago
|
Whiteboard: [nsbeta2-] → [nsbeta2-][nsbeta3-]
Comment 32•24 years ago
|
||
Comment 33•24 years ago
|
||
WINMM is also being pulled into memory by nspr, which is calling timeGetTime().
Comment 34•24 years ago
|
||
The NSPR winmm.dll fix has been checked in on
NSPRPUB_CLIENT_BRANCH. (See bug #42714.)
Comment 35•24 years ago
|
||
RTM+?
PS. MOST WANTED!!!
Comment 36•24 years ago
|
||
Edward: Welcome to xpcom!
Status: ASSIGNED → NEW
QA Contact: gbush → rayw
Target Milestone: M20 → mozilla1.0
Comment 37•24 years ago
|
||
Once again... attempting to reassign from Ray to Edward.
Assignee: rayw → kandrot
Comment 38•24 years ago
|
||
Small side note for anyone who's interested: Windows Developer's Journal
published a nice little tool in their latest issue called LoadSpy for monitoring
loading/initialization times for DLLs, etc. The code is at http://www.wdj.com/code/
Updated•24 years ago
|
Comment 39•24 years ago
|
||
BAsed on recent numbers, this no longer seems to be true. On a fast machine,
there is a 12 sec launch time, but by removing the java plugin, it drops to 3
sec (there is a bug on this). On a slower machine, there is a 12-15 sec launch
time the first time, then 3-4 sec the second time. The extra 8-12 sec are dlls
loading. There is a solution in the works by rickg that preloads the dlls
under Windows, therefore removing most of this dll load time. There is also
research into a static app.
If there is a current list of dlls that should not be loaded at start up,
please add them to this bug, then create bugs for them. Currently, I am
assuming that this is either a solved problem (or being solved), and marking it
future for now.
Status: NEW → ASSIGNED
Priority: P1 → P4
Target Milestone: mozilla1.0 → Future
Comment 40•24 years ago
|
||
The preloading option shouldn't be a crutch. Most people are (understandably)
annoyed by apps always running in the background and using resources.
Updated•23 years ago
|
Whiteboard: [nav+perf]
Comment 41•23 years ago
|
||
reassign all kandrot xpcom bug.
Assignee: kandrot → dougt
Status: ASSIGNED → NEW
Target Milestone: Future → ---
Comment 43•23 years ago
|
||
btw, we're down to about 41 .dll's loaded on startup (w/out Java)
Comment 44•23 years ago
|
||
has this changed for the better since 9-10?, I think startup time has gotten
much better over the last several milestones, including upto 0.9.8. One I
remember, in particular is the smaller size (kb) images for splash screens, and
some about delaying code/dlls?
Comment 45•23 years ago
|
||
Is there a startup-graph available to track the improvements made?
Updated•23 years ago
|
OS: Windows NT → All
Hardware: PC → All
Updated•22 years ago
|
Comment 46•21 years ago
|
||
Is this bug still valid since it is so old? If it is, I want to vote for it.
Updated•18 years ago
|
Assignee: cathleennscp → nobody
QA Contact: rayw → xpcom
Comment 47•17 years ago
|
||
this is not valid any longer. we are building everything into a single dll/dso.
Status: NEW → RESOLVED
Closed: 17 years ago
Resolution: --- → INVALID
Comment 48•17 years ago
|
||
Isn't it still valid for Seamonkey until it starts using libxul?
Comment 49•17 years ago
|
||
i do not think it is a core xpcom problem. Feel free to open up application specific.
You need to log in
before you can comment on or make changes to this bug.
Description
•