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 3072B138A6C for ; Tue, 18 Nov 2014 06:57:51 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 4B19CE09DF; Tue, 18 Nov 2014 06:57:49 +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 CFC3CE09DE for ; Tue, 18 Nov 2014 06:57:48 +0000 (UTC) Received: from localhost.localdomain (ip70-181-96-121.oc.oc.cox.net [70.181.96.121]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: zmedico) by smtp.gentoo.org (Postfix) with ESMTPSA id B118F34047D; Tue, 18 Nov 2014 06:57:47 +0000 (UTC) From: Zac Medico To: gentoo-portage-dev@lists.gentoo.org Cc: Zac Medico Subject: [gentoo-portage-dev] [PATCH] _slot_operator_update_probe: memoize use_reduce (529660) Date: Mon, 17 Nov 2014 22:57:42 -0800 Message-Id: <1416293862-15646-1-git-send-email-zmedico@gentoo.org> X-Mailer: git-send-email 2.0.4 Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-portage-dev@lists.gentoo.org Reply-to: gentoo-portage-dev@lists.gentoo.org X-Archives-Salt: 923e5f4f-c48f-4f64-90c5-3134794d456a X-Archives-Hash: 8addb8ef115b6b88c2a999e91a36b830 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 --- 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 6f1910d..3f4a097 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 -- 2.0.4