diff options
author | Zac Medico <zmedico@gentoo.org> | 2010-10-14 19:01:39 -0700 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2010-10-15 03:05:32 -0700 |
commit | a59190f10af068567670224418bae88b6072b809 (patch) | |
tree | 7367ff5dde1d203ede559cecfdfe1d6038795686 | |
parent | c6cead137cfbbb65e26267233b3a5bf1b6d0b2be (diff) | |
download | portage-a59190f10af068567670224418bae88b6072b809.tar.gz portage-a59190f10af068567670224418bae88b6072b809.tar.bz2 portage-a59190f10af068567670224418bae88b6072b809.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 e9e62a2c9..6744d9072 100644 --- a/pym/_emerge/depgraph.py +++ b/pym/_emerge/depgraph.py @@ -4122,9 +4122,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 @@ -4251,9 +4248,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): @@ -4262,7 +4270,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) |