Mercurial > public > mercurial-scm > hg
comparison contrib/perf-utils/subsetmaker.py @ 49014:5a24bb7f4ed7
subsetmaker: use SortedSet for the scratch variant
This provides a massive speedup on wide repository with many heads. For example
on mozilla-try, this move from un-usable slow to fairly instant.
Differential Revision: https://phab.mercurial-scm.org/D12395
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Sun, 13 Mar 2022 16:24:01 +0100 |
parents | 186223795e4a |
children | 3f6ddb1c193b |
comparison
equal
deleted
inserted
replaced
49013:186223795e4a | 49014:5a24bb7f4ed7 |
---|---|
12 registrar, | 12 registrar, |
13 revset, | 13 revset, |
14 revsetlang, | 14 revsetlang, |
15 smartset, | 15 smartset, |
16 ) | 16 ) |
17 | |
18 import sortedcontainers | |
19 | |
20 SortedSet = sortedcontainers.SortedSet | |
17 | 21 |
18 revsetpredicate = registrar.revsetpredicate() | 22 revsetpredicate = registrar.revsetpredicate() |
19 | 23 |
20 | 24 |
21 @revsetpredicate(b'subsetspec("<spec>")') | 25 @revsetpredicate(b'subsetspec("<spec>")') |
76 assert False | 80 assert False |
77 | 81 |
78 n = revsetlang.getinteger(n, _(b"scratch expects a number")) | 82 n = revsetlang.getinteger(n, _(b"scratch expects a number")) |
79 | 83 |
80 selected = set() | 84 selected = set() |
81 heads = set() | 85 heads = SortedSet() |
82 children_count = collections.defaultdict(lambda: 0) | 86 children_count = collections.defaultdict(lambda: 0) |
83 parents = repo.changelog._uncheckedparentrevs | 87 parents = repo.changelog._uncheckedparentrevs |
84 | 88 |
85 baseset = revset.getset(repo, smartset.fullreposet(repo), x) | 89 baseset = revset.getset(repo, smartset.fullreposet(repo), x) |
86 baseset.sort() | 90 baseset.sort() |
100 | 104 |
101 selected = set() | 105 selected = set() |
102 for x in range(n): | 106 for x in range(n): |
103 if not heads: | 107 if not heads: |
104 break | 108 break |
105 pickable = list(heads) | 109 pick = rand.choice(heads) |
106 pickable.sort() | |
107 pick = rand.choice(pickable) | |
108 heads.remove(pick) | 110 heads.remove(pick) |
109 assert pick not in selected | 111 assert pick not in selected |
110 selected.add(pick) | 112 selected.add(pick) |
111 p1, p2 = parents(pick) | 113 p1, p2 = parents(pick) |
112 if p1 in children_count: | 114 if p1 in children_count: |