Gentoo Archives: gentoo-portage-dev

From: Zac Medico <zmedico@g.o>
To: gentoo-portage-dev@l.g.o
Cc: Zac Medico <zmedico@g.o>
Subject: [gentoo-portage-dev] [PATCH] _slot_operator_update_probe: memoize use_reduce (529660)
Date: Tue, 18 Nov 2014 06:57:51
Message-Id: 1416293862-15646-1-git-send-email-zmedico@gentoo.org
1 Memoize the results of use_reduce calls inside
2 _slot_operator_update_probe, in order to improve performance. With
3 memoization, 'emerge -puvDN @world' on one of my computers takes
4 22.4% less time, and results in 13.5% fewer use_reduce calls.
5
6 X-Gentoo-Bug: 529660
7 X-Gentoo-Url: https://bugs.gentoo.org/show_bug.cgi?id=529660
8 ---
9 pym/_emerge/depgraph.py | 65 ++++++++++++++++++++++++++++++++++---------------
10 1 file changed, 45 insertions(+), 20 deletions(-)
11
12 diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
13 index 6f1910d..3f4a097 100644
14 --- a/pym/_emerge/depgraph.py
15 +++ b/pym/_emerge/depgraph.py
16 @@ -399,6 +399,7 @@ class _dynamic_depgraph_config(object):
17 self._initially_unsatisfied_deps = []
18 self._ignored_deps = []
19 self._highest_pkg_cache = {}
20 + self._flatten_atoms_cache = {}
21
22 # Binary packages that have been rejected because their USE
23 # didn't match the user's config. It maps packages to a set
24 @@ -1719,26 +1720,10 @@ class depgraph(object):
25
26 selected_atoms = None
27
28 - atoms = set()
29 - invalid_metadata = False
30 - for dep_key in ("DEPEND", "HDEPEND", "RDEPEND", "PDEPEND"):
31 - dep_string = replacement_parent._metadata[dep_key]
32 - if not dep_string:
33 - continue
34 -
35 - try:
36 - dep_string = portage.dep.use_reduce(dep_string,
37 - uselist=self._pkg_use_enabled(replacement_parent),
38 - is_valid_flag=replacement_parent.iuse.is_valid_flag,
39 - flat=True, token_class=Atom,
40 - eapi=replacement_parent.eapi)
41 - except portage.exception.InvalidDependString:
42 - invalid_metadata = True
43 - break
44 -
45 - atoms.update(token for token in dep_string if isinstance(token, Atom))
46 -
47 - if invalid_metadata:
48 + try:
49 + atoms = self._flatten_atoms(replacement_parent,
50 + self._pkg_use_enabled(replacement_parent))
51 + except InvalidDependString:
52 continue
53
54 # List of list of child,atom pairs for each atom.
55 @@ -2005,6 +1990,46 @@ class depgraph(object):
56 return frozenset(x.unevaluated_atom for
57 x in selected_atoms)
58
59 + def _flatten_atoms(self, pkg, use):
60 + """
61 + Evaluate all dependency atoms of the given package, and return
62 + them as a frozenset. For performance, results are cached.
63 +
64 + @param pkg: a Package instance
65 + @type pkg: Package
66 + @param pkg: set of enabled USE flags
67 + @type pkg: frozenset
68 + @rtype: frozenset
69 + @return: set of evaluated atoms
70 + """
71 +
72 + cache_key = (pkg, use)
73 +
74 + try:
75 + return self._dynamic_config._flatten_atoms_cache[cache_key]
76 + except KeyError:
77 + pass
78 +
79 + atoms = []
80 +
81 + for dep_key in pkg._dep_keys:
82 + dep_string = pkg._metadata[dep_key]
83 + if not dep_string:
84 + continue
85 +
86 + dep_string = portage.dep.use_reduce(
87 + dep_string, uselist=use,
88 + is_valid_flag=pkg.iuse.is_valid_flag,
89 + flat=True, token_class=Atom, eapi=pkg.eapi)
90 +
91 + atoms.extend(token for token in dep_string
92 + if isinstance(token, Atom))
93 +
94 + atoms = frozenset(atoms)
95 +
96 + self._dynamic_config._flatten_atoms_cache[cache_key] = atoms
97 + return atoms
98 +
99 def _iter_similar_available(self, graph_pkg, atom, autounmask_level=None):
100 """
101 Given a package that's in the graph, do a rough check to
102 --
103 2.0.4

Replies