[patch] Preload popup menus for the desktop (3.5)

Scott Wheeler wheeler at kde.org
Tue Apr 4 22:53:02 BST 2006


On Tuesday 04 April 2006 20:03, David Faure wrote:

> Interesting; so finding and loading plugins is what's slow, rather than
> config file parsing... But how many plugin do you get there? I thought we
> only had a few: kuick, ark, akregator. That's all I get when doing
> "ktradertest KonqPopupMenu/Plugin".

I also get the same three and they're pretty consistently around 40 ms each 
here.

> Oh, so it's the plugin code that's slow, not the dlopen stuff? Hmm, well,
> symbols are looked up on demand iirc so it's probably hard to distinguish
> the two; iirc setting LD_BIND_NOW=true forces all symbols to be resolved
> right away, this might be a way to find out.

The dlopen isn't insignificant, but it's only happening once per library (from 
what I can tell), so it disappears quickly in the profiling (total time of 
about 50 ms even after dozens of menus are generated).

> Could it be that it's one of the above three plugins that has lots of
> "startup" code? I only had a look at kuick's code and it looks... quick :)

It's pretty consistant here -- give or take a few ms -- between the three 
plugins.

> Yes; I first thought we could just use another parent object; but in fact
> we can't, the popupmenu plugins certainly need to know the popupmenu into
> which they're plugging their stuff,

Yep, I tried that too.  Boom.  ;-)

> so they can't possibly be cached, 
> unless the whole popupmenu is reused... which was your initial idea; but
> which still strikes me as a large use of memory, potentially (there are
> many mimetypes, one might end up with a very large number of popupmenus
> cached, except if using QCache...)

In my original patch I did use a QCache, though I was doing things per item.  
We could probably save a bit more doing one menu per mime type.

> Presumably there's substantial time spent in the KSimpleConfig creation on
> 675, no?

Nope.  1-2 ms here.  (I have that whole if block in one profile block and I 
did check to make sure it's being hit.)

The other two blocks of significance here are the one starting with:

QStringList dirs = KGlobal::dirs()->findDirs( "data", 
"konqueror/servicemenus/" );

...and the following large for loop -- that varies a lot, presumably based on 
whether or not DCOP calls are used.  Here it's often as little as 20% and as 
much as 60%.  That's another area I want to look at more closely.

The next one starts with:

KTrader::OfferList offers;

if (kapp->authorizeKAction("openwith"))
{
    ...

The if block there is about 10% of the total time, but presumably that can 
also be cached in the way that the other KTrader offers list is.

-Scott

-- 
The world is full of magical things patiently waiting for our wits to grow 
sharper. 
--Bertrand Russell




More information about the kde-core-devel mailing list