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 |