diff options
author | Zac Medico <zmedico@gentoo.org> | 2010-10-14 19:01:39 -0700 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2010-10-14 19:01:39 -0700 |
commit | e0cc5ef31f9459b3c1615ce45cbb48c27e1b178f (patch) | |
tree | a706d28f81586f4e57ceb0e464f1f19eb7fe6332 | |
parent | 8f91b6615617af839a31e51bd3bb2048ea81ea56 (diff) | |
download | portage-e0cc5ef31f9459b3c1615ce45cbb48c27e1b178f.tar.gz portage-e0cc5ef31f9459b3c1615ce45cbb48c27e1b178f.tar.bz2 portage-e0cc5ef31f9459b3c1615ce45cbb48c27e1b178f.zip |
Optimize uninstall selection in serialize_tasks.
This increases performance dramatically in cases when there are
hundreds of blockers to solve, like when when upgrading to a new slot
of kde-meta.
-rw-r--r-- | pym/_emerge/depgraph.py | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py index 31f97ec15..adef1193d 100644 --- a/pym/_emerge/depgraph.py +++ b/pym/_emerge/depgraph.py @@ -4168,9 +4168,6 @@ class depgraph(object): min_parent_deps = None uninst_task = None - # FIXME: This loop can be extremely slow when - # there of lots of blockers to solve - # (especially the gather_deps part). for task in myblocker_uninstalls.leaf_nodes(): # Do some sanity checks so that system or world packages # don't get uninstalled inappropriately here (only really @@ -4297,9 +4294,20 @@ class depgraph(object): self._spinner_update() mergeable_parent = False parent_deps = set() + parent_deps.add(task) for parent in mygraph.parent_nodes(task): parent_deps.update(mygraph.child_nodes(parent, ignore_priority=priority_range.ignore_medium_soft)) + if min_parent_deps is not None and \ + len(parent_deps) >= min_parent_deps: + # This task is no better than a previously selected + # task, so abort search now in order avoid wasting + # any more cpu time on this task. This increases + # performance dramatically in cases when there are + # hundreds of blockers to solve, like when + # when upgrading to a new slot of kde-meta. + mergeable_parent = None + break if parent in mergeable_nodes and \ gather_deps(ignore_uninst_or_med_soft, mergeable_nodes, set(), parent): @@ -4308,7 +4316,6 @@ class depgraph(object): if not mergeable_parent: continue - parent_deps.remove(task) if min_parent_deps is None or \ len(parent_deps) < min_parent_deps: min_parent_deps = len(parent_deps) |