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: