##// END OF EJS Templates
compare-disco: display a header by default...
marmoute -
r50355:3c026138 default
parent child Browse files
Show More
@@ -1,188 +1,213 b''
1 1 #!/usr/bin/env python3
2 2 # compare various algorithm variants for a given case
3 3 #
4 4 # search-discovery-case REPO LOCAL_CASE REMOTE_CASE
5 5 #
6 6 # The description for the case input uses the same format as the ouput of
7 7 # search-discovery-case
8 8
9 9 import json
10 10 import os
11 11 import subprocess
12 12 import sys
13 13
14 14 this_script = os.path.abspath(sys.argv[0])
15 15 script_name = os.path.basename(this_script)
16 16 this_dir = os.path.dirname(this_script)
17 17 hg_dir = os.path.join(this_dir, '..', '..')
18 18 HG_REPO = os.path.normpath(hg_dir)
19 19 HG_BIN = os.path.join(HG_REPO, 'hg')
20 20
21 21
22 22 SUBSET_PATH = os.path.join(HG_REPO, 'contrib', 'perf-utils', 'subsetmaker.py')
23 23
24 24 CMD_BASE = (
25 25 HG_BIN,
26 26 'debugdiscovery',
27 27 '--template',
28 28 'json',
29 29 '--config',
30 30 'extensions.subset=%s' % SUBSET_PATH,
31 31 )
32 32
33 33 # --old
34 34 # --nonheads
35 35 #
36 36 # devel.discovery.exchange-heads=True
37 37 # devel.discovery.grow-sample=True
38 38 # devel.discovery.grow-sample.dynamic=True
39 39
40 40 VARIANTS = {
41 41 'tree-discovery': ('--old',),
42 42 'set-discovery-basic': (
43 43 '--config',
44 44 'devel.discovery.exchange-heads=no',
45 45 '--config',
46 46 'devel.discovery.grow-sample=no',
47 47 '--config',
48 48 'devel.discovery.grow-sample.dynamic=no',
49 49 '--config',
50 50 'devel.discovery.randomize=yes',
51 51 ),
52 52 'set-discovery-heads': (
53 53 '--config',
54 54 'devel.discovery.exchange-heads=yes',
55 55 '--config',
56 56 'devel.discovery.grow-sample=no',
57 57 '--config',
58 58 'devel.discovery.grow-sample.dynamic=no',
59 59 '--config',
60 60 'devel.discovery.randomize=yes',
61 61 ),
62 62 'set-discovery-grow-sample': (
63 63 '--config',
64 64 'devel.discovery.exchange-heads=yes',
65 65 '--config',
66 66 'devel.discovery.grow-sample=yes',
67 67 '--config',
68 68 'devel.discovery.grow-sample.dynamic=no',
69 69 '--config',
70 70 'devel.discovery.randomize=yes',
71 71 ),
72 72 'set-discovery-dynamic-sample': (
73 73 '--config',
74 74 'devel.discovery.exchange-heads=yes',
75 75 '--config',
76 76 'devel.discovery.grow-sample=yes',
77 77 '--config',
78 78 'devel.discovery.grow-sample.dynamic=yes',
79 79 '--config',
80 80 'devel.discovery.randomize=yes',
81 81 ),
82 82 'set-discovery-default': (
83 83 '--config',
84 84 'devel.discovery.randomize=yes',
85 85 ),
86 86 }
87 87
88 88 VARIANTS_KEYS = [
89 89 'tree-discovery',
90 90 'set-discovery-basic',
91 91 'set-discovery-heads',
92 92 'set-discovery-grow-sample',
93 93 'set-discovery-dynamic-sample',
94 94 'set-discovery-default',
95 95 ]
96 96
97 97 assert set(VARIANTS.keys()) == set(VARIANTS_KEYS)
98 98
99 99
100 100 def format_case(case):
101 101 return '-'.join(str(s) for s in case)
102 102
103 103
104 104 def to_revsets(case):
105 105 t = case[0]
106 106 if t == 'scratch':
107 107 return 'not scratch(all(), %d, "%d")' % (case[1], case[2])
108 108 elif t == 'randomantichain':
109 109 return '::randomantichain(all(), "%d")' % case[1]
110 110 elif t == 'rev':
111 111 return '::%d' % case[1]
112 112 else:
113 113 assert False
114 114
115 115
116 def compare(repo, local_case, remote_case):
116 def compare(
117 repo,
118 local_case,
119 remote_case,
120 display_header=True,
121 ):
117 122 case = (repo, local_case, remote_case)
123 if display_header:
124 print(
125 "#",
126 "repo",
127 "local-subset",
128 "remote-subset",
129 "discovery-variant",
130 "roundtrips",
131 "queries",
132 "revs",
133 "local-heads",
134 "common-heads",
135 "undecided-initial",
136 "undecided-common",
137 "undecided-missing",
138 )
118 139 for variant in VARIANTS_KEYS:
119 140 res = process(case, VARIANTS[variant])
120 141 revs = res["nb-revs"]
121 142 local_heads = res["nb-head-local"]
122 143 common_heads = res["nb-common-heads"]
123 144 roundtrips = res["total-roundtrips"]
124 145 queries = res["total-queries"]
125 146 if 'tree-discovery' in variant:
126 147 print(
127 148 repo,
128 149 format_case(local_case),
129 150 format_case(remote_case),
130 151 variant,
131 152 roundtrips,
132 153 queries,
133 154 revs,
134 155 local_heads,
135 156 common_heads,
136 157 )
137 158 else:
138 159 undecided_common = res["nb-ini_und-common"]
139 160 undecided_missing = res["nb-ini_und-missing"]
140 161 undecided = undecided_common + undecided_missing
141 162 print(
142 163 repo,
143 164 format_case(local_case),
144 165 format_case(remote_case),
145 166 variant,
146 167 roundtrips,
147 168 queries,
148 169 revs,
149 170 local_heads,
150 171 common_heads,
151 172 undecided,
152 173 undecided_common,
153 174 undecided_missing,
154 175 )
155 176 return 0
156 177
157 178
158 179 def process(case, variant):
159 180 (repo, left, right) = case
160 181 cmd = list(CMD_BASE)
161 182 cmd.append('-R')
162 183 cmd.append(repo)
163 184 cmd.append('--local-as-revs')
164 185 cmd.append(to_revsets(left))
165 186 cmd.append('--remote-as-revs')
166 187 cmd.append(to_revsets(right))
167 188 cmd.extend(variant)
168 189 s = subprocess.Popen(cmd, stdout=subprocess.PIPE)
169 190 out, err = s.communicate()
170 191 return json.loads(out)[0]
171 192
172 193
173 194 if __name__ == '__main__':
174 195
175 196 argv = sys.argv[:]
176 197
177 198 kwargs = {}
199 # primitive arg parsing
200 if '--no-header' in argv:
201 kwargs['display_header'] = False
202 argv = [a for a in argv if a != '--no-header']
178 203
179 204 if len(argv) != 4:
180 205 usage = f'USAGE: {script_name} REPO LOCAL_CASE REMOTE_CASE'
181 206 print(usage, file=sys.stderr)
182 207 sys.exit(128)
183 208 repo = argv[1]
184 209 local_case = argv[2].split('-')
185 210 local_case = (local_case[0],) + tuple(int(x) for x in local_case[1:])
186 211 remote_case = argv[3].split('-')
187 212 remote_case = (remote_case[0],) + tuple(int(x) for x in remote_case[1:])
188 213 sys.exit(compare(repo, local_case, remote_case, **kwargs))
General Comments 0
You need to be logged in to leave comments. Login now