From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) by finch.gentoo.org (Postfix) with ESMTP id C4443138ACE for ; Mon, 24 Nov 2014 08:13:36 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 6E3A9E0A9B; Mon, 24 Nov 2014 08:13:34 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id E854BE0A9B for ; Mon, 24 Nov 2014 08:13:33 +0000 (UTC) Received: from oystercatcher.gentoo.org (oystercatcher.gentoo.org [148.251.78.52]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id B2FFB340514 for ; Mon, 24 Nov 2014 08:13:32 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by oystercatcher.gentoo.org (Postfix) with ESMTP id 5F5FEACAF for ; Mon, 24 Nov 2014 08:13:31 +0000 (UTC) From: "Zac Medico" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Zac Medico" Message-ID: <1416816027.9ba4f2aa6a2755a73fb652b4557919047d649fd1.zmedico@gentoo> Subject: [gentoo-commits] proj/portage:master commit in: pym/_emerge/ X-VCS-Repository: proj/portage X-VCS-Files: pym/_emerge/depgraph.py X-VCS-Directories: pym/_emerge/ X-VCS-Committer: zmedico X-VCS-Committer-Name: Zac Medico X-VCS-Revision: 9ba4f2aa6a2755a73fb652b4557919047d649fd1 X-VCS-Branch: master Date: Mon, 24 Nov 2014 08:13:31 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Archives-Salt: 542a5aa6-a55c-4781-a795-ed689c80515d X-Archives-Hash: f365cfde450cdfd1904a2bc48038b0aa commit: 9ba4f2aa6a2755a73fb652b4557919047d649fd1 Author: Zac Medico gentoo org> AuthorDate: Tue Nov 18 06:50:46 2014 +0000 Commit: Zac Medico gentoo org> CommitDate: Mon Nov 24 08:00:27 2014 +0000 URL: http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=9ba4f2aa _slot_operator_update_probe: memoize use_reduce (529660) Memoize the results of use_reduce calls inside _slot_operator_update_probe, in order to improve performance. With memoization, 'emerge -puvDN @world' on one of my computers takes 22.4% less time, and results in 13.5% fewer use_reduce calls. X-Gentoo-Bug: 529660 X-Gentoo-Url: https://bugs.gentoo.org/show_bug.cgi?id=529660 Acked-by: Brian Dolbec gentoo.org> --- pym/_emerge/depgraph.py | 65 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py index 505d8a8..873c67d 100644 --- a/pym/_emerge/depgraph.py +++ b/pym/_emerge/depgraph.py @@ -399,6 +399,7 @@ class _dynamic_depgraph_config(object): self._initially_unsatisfied_deps = [] self._ignored_deps = [] self._highest_pkg_cache = {} + self._flatten_atoms_cache = {} # Binary packages that have been rejected because their USE # didn't match the user's config. It maps packages to a set @@ -1719,26 +1720,10 @@ class depgraph(object): selected_atoms = None - atoms = set() - invalid_metadata = False - for dep_key in ("DEPEND", "HDEPEND", "RDEPEND", "PDEPEND"): - dep_string = replacement_parent._metadata[dep_key] - if not dep_string: - continue - - try: - dep_string = portage.dep.use_reduce(dep_string, - uselist=self._pkg_use_enabled(replacement_parent), - is_valid_flag=replacement_parent.iuse.is_valid_flag, - flat=True, token_class=Atom, - eapi=replacement_parent.eapi) - except portage.exception.InvalidDependString: - invalid_metadata = True - break - - atoms.update(token for token in dep_string if isinstance(token, Atom)) - - if invalid_metadata: + try: + atoms = self._flatten_atoms(replacement_parent, + self._pkg_use_enabled(replacement_parent)) + except InvalidDependString: continue # List of list of child,atom pairs for each atom. @@ -2005,6 +1990,46 @@ class depgraph(object): return frozenset(x.unevaluated_atom for x in selected_atoms) + def _flatten_atoms(self, pkg, use): + """ + Evaluate all dependency atoms of the given package, and return + them as a frozenset. For performance, results are cached. + + @param pkg: a Package instance + @type pkg: Package + @param pkg: set of enabled USE flags + @type pkg: frozenset + @rtype: frozenset + @return: set of evaluated atoms + """ + + cache_key = (pkg, use) + + try: + return self._dynamic_config._flatten_atoms_cache[cache_key] + except KeyError: + pass + + atoms = [] + + for dep_key in pkg._dep_keys: + dep_string = pkg._metadata[dep_key] + if not dep_string: + continue + + dep_string = portage.dep.use_reduce( + dep_string, uselist=use, + is_valid_flag=pkg.iuse.is_valid_flag, + flat=True, token_class=Atom, eapi=pkg.eapi) + + atoms.extend(token for token in dep_string + if isinstance(token, Atom)) + + atoms = frozenset(atoms) + + self._dynamic_config._flatten_atoms_cache[cache_key] = atoms + return atoms + def _iter_similar_available(self, graph_pkg, atom, autounmask_level=None): """ Given a package that's in the graph, do a rough check to