9 # call with --help for details |
9 # call with --help for details |
10 |
10 |
11 import sys |
11 import sys |
12 import os |
12 import os |
13 import re |
13 import re |
|
14 import math |
14 from subprocess import check_call, Popen, CalledProcessError, STDOUT, PIPE |
15 from subprocess import check_call, Popen, CalledProcessError, STDOUT, PIPE |
15 # cannot use argparse, python 2.7 only |
16 # cannot use argparse, python 2.7 only |
16 from optparse import OptionParser |
17 from optparse import OptionParser |
17 |
18 |
18 def check_output(*args, **kwargs): |
19 def check_output(*args, **kwargs): |
101 nbidx //= 10 |
102 nbidx //= 10 |
102 if not idxwidth: |
103 if not idxwidth: |
103 idxwidth = 1 |
104 idxwidth = 1 |
104 return idxwidth |
105 return idxwidth |
105 |
106 |
106 def printresult(idx, data, maxidx, verbose=False): |
107 def getfactor(main, other, field, sensitivity=0.05): |
|
108 """return the relative factor between values for 'field' in main and other |
|
109 |
|
110 Return None if the factor is insignicant (less than <sensitivity> |
|
111 variation).""" |
|
112 factor = 1 |
|
113 if main is not None: |
|
114 factor = other[field] / main[field] |
|
115 low, high = 1 - sensitivity, 1 + sensitivity |
|
116 if (low < factor < high): |
|
117 return None |
|
118 return factor |
|
119 |
|
120 def formatfactor(factor): |
|
121 """format a factor into a 4 char string |
|
122 |
|
123 22% |
|
124 156% |
|
125 x2.4 |
|
126 x23 |
|
127 x789 |
|
128 x1e4 |
|
129 x5x7 |
|
130 |
|
131 """ |
|
132 if factor is None: |
|
133 return ' ' |
|
134 elif factor < 2: |
|
135 return '%3i%%' % (factor * 100) |
|
136 elif factor < 10: |
|
137 return 'x%3.1f' % factor |
|
138 elif factor < 1000: |
|
139 return '%4s' % ('x%i' % factor) |
|
140 else: |
|
141 order = int(math.log(factor)) + 1 |
|
142 while 1 < math.log(factor): |
|
143 factor //= 0 |
|
144 return 'x%ix%i' % (factor, order) |
|
145 |
|
146 _marker = object() |
|
147 def printresult(idx, data, maxidx, verbose=False, reference=_marker): |
107 """print a line of result to stdout""" |
148 """print a line of result to stdout""" |
108 mask = '%%0%ii) %%s' % idxwidth(maxidx) |
149 mask = '%%0%ii) %%s' % idxwidth(maxidx) |
109 out = ['%10.6f' % data['wall']] |
150 out = ['%10.6f' % data['wall']] |
|
151 if reference is not _marker: |
|
152 factor = None |
|
153 if reference is not None: |
|
154 factor = getfactor(reference, data, 'wall') |
|
155 out.append(formatfactor(factor)) |
110 if verbose: |
156 if verbose: |
111 out.append('%10.6f' % data['comb']) |
157 out.append('%10.6f' % data['comb']) |
112 out.append('%10.6f' % data['user']) |
158 out.append('%10.6f' % data['user']) |
113 out.append('%10.6f' % data['sys']) |
159 out.append('%10.6f' % data['sys']) |
114 out.append('%6d' % data['count']) |
160 out.append('%6d' % data['count']) |
115 print mask % (idx, ' '.join(out)) |
161 print mask % (idx, ' '.join(out)) |
116 |
162 |
117 def printheader(maxidx, verbose=False): |
163 def printheader(maxidx, verbose=False, relative=False): |
118 header = [' ' * (idxwidth(maxidx) + 1), |
164 header = [' ' * (idxwidth(maxidx) + 1), |
119 ' %-8s' % 'time'] |
165 ' %-8s' % 'time'] |
|
166 if relative: |
|
167 header.append(' ') |
120 if verbose: |
168 if verbose: |
121 header.append(' %-8s' % 'comb') |
169 header.append(' %-8s' % 'comb') |
122 header.append(' %-8s' % 'user') |
170 header.append(' %-8s' % 'user') |
123 header.append(' %-8s' % 'sys') |
171 header.append(' %-8s' % 'sys') |
124 header.append('%6s' % 'count') |
172 header.append('%6s' % 'count') |
206 print |
254 print |
207 |
255 |
208 for ridx, rset in enumerate(revsets): |
256 for ridx, rset in enumerate(revsets): |
209 |
257 |
210 print "revset #%i: %s" % (ridx, rset) |
258 print "revset #%i: %s" % (ridx, rset) |
211 printheader(len(results), verbose=options.verbose) |
259 printheader(len(results), verbose=options.verbose, relative=True) |
|
260 ref = None |
212 for idx, data in enumerate(results): |
261 for idx, data in enumerate(results): |
213 printresult(idx, data[ridx], len(results), verbose=options.verbose) |
262 printresult(idx, data[ridx], len(results), verbose=options.verbose, |
|
263 reference=ref) |
|
264 ref = data[ridx] |
214 print |
265 print |