let's optimize: Project::itemsForUrl

Andreas Pakulat apaku at gmx.de
Fri Sep 9 19:52:52 UTC 2011


On 09.09.11 16:45:50, Milian Wolff wrote:
> Hey all,
> 
> the function Project::itemsForUrl is *really* slow when we look at the total 
> amount of time spent in there when parsing a biggish project. I just did that 
> (with a simple QTimer and a static elapsed counter) and the last output was:
> 
> QList<KDevelop::ProjectBaseItem*> KDevelop::ProjectPrivate::itemsForUrl(const 
> KUrl&) const elapsed time: 56870 
> 
> Yes, nearly a minute was spent in that function. So I would really like to 
> improve that.
> 
> The code/apaku already mentions this:
> 
>         // TODO: This is moderately efficient, but could be much faster with a
>         // QHash<QString, ProjectFolderItem> member. Would it be worth it?
> 
> I'm pretty sure he meant ProjectBaseItem. The question is, how to keep that in 
> sync. We could put that into the ProjectModel and update it on every call to 
> setUrl (if model()) and in setModel. I'm not so sure on the memory 
> requirements though. We could of course just reuse IndexedString's new 
> indexForString method, so the mem requirement would be (sizeof(uint) + 
> sizeof(ProjectBaseItem*)) * N_items. Which is only a bit more than a megabyte 
> on my machine (64Bit) for 100k items.
> 
> What do you think? Any other ideas? I also thought about comparing the start 
> of the urls: If we could expect to have a proper hierarchy in the model, that 
> follows the URL path hierarchy, that could be leveraged to improve the 
> performance as well, by returning early. But I'm not so sure if that could be 
> done without breaking stuff, as e.g. the URLs inside targets don't follow the 
> URL hierarchy.

Well, thats not much of a problem I think, you can easily handle that
inside itemsForUrlInternal by checking the parent of the target item
(wich is a rather efficient operation) and use that url for the
prefix-check.

Andreas





More information about the KDevelop-devel mailing list