Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(297)

Side by Side Diff: tools/perf_expectations/make_expectations.py

Issue 7942011: Support setting 'better' and using it in expectations. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix nits Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | tools/perf_expectations/perf_expectations.json » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 6
7 import hashlib 7 import hashlib
8 import math 8 import math
9 import optparse 9 import optparse
10 import os 10 import os
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 return text 72 return text
73 73
74 74
75 def GetRowData(data, key): 75 def GetRowData(data, key):
76 rowdata = [] 76 rowdata = []
77 # reva and revb always come first. 77 # reva and revb always come first.
78 for subkey in ['reva', 'revb']: 78 for subkey in ['reva', 'revb']:
79 if subkey in data[key]: 79 if subkey in data[key]:
80 rowdata.append('"%s": %s' % (subkey, data[key][subkey])) 80 rowdata.append('"%s": %s' % (subkey, data[key][subkey]))
81 # Strings, like type, come next. 81 # Strings, like type, come next.
82 for subkey in ['type']: 82 for subkey in ['type', 'better']:
83 if subkey in data[key]: 83 if subkey in data[key]:
84 rowdata.append('"%s": "%s"' % (subkey, data[key][subkey])) 84 rowdata.append('"%s": "%s"' % (subkey, data[key][subkey]))
85 # Finally the main numbers come last. 85 # Finally the main numbers come last.
86 for subkey in ['improve', 'regress', 'tolerance']: 86 for subkey in ['improve', 'regress', 'tolerance']:
87 if subkey in data[key]: 87 if subkey in data[key]:
88 rowdata.append('"%s": %s' % (subkey, data[key][subkey])) 88 rowdata.append('"%s": %s' % (subkey, data[key][subkey]))
89 return rowdata 89 return rowdata
90 90
91 91
92 def GetRowDigest(rowdata, key): 92 def GetRowDigest(rowdata, key):
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 # Fetch graphs.dat for this combination. 153 # Fetch graphs.dat for this combination.
154 perfkeys = perf.keys() 154 perfkeys = perf.keys()
155 # In perf_expectations.json, ignore the 'load' key. 155 # In perf_expectations.json, ignore the 'load' key.
156 perfkeys.remove('load') 156 perfkeys.remove('load')
157 perfkeys.sort() 157 perfkeys.sort()
158 158
159 write_new_expectations = False 159 write_new_expectations = False
160 for key in perfkeys: 160 for key in perfkeys:
161 value = perf[key] 161 value = perf[key]
162 tolerance = value.get('tolerance', DEFAULT_TOLERANCE) 162 tolerance = value.get('tolerance', DEFAULT_TOLERANCE)
163 better = value.get('better', None)
163 164
164 # Verify the checksum. 165 # Verify the checksum.
165 original_checksum = value.get('sha1', '') 166 original_checksum = value.get('sha1', '')
166 if 'sha1' in value: 167 if 'sha1' in value:
167 del value['sha1'] 168 del value['sha1']
168 rowdata = GetRowData(perf, key) 169 rowdata = GetRowData(perf, key)
169 computed_checksum = GetRowDigest(rowdata, key) 170 computed_checksum = GetRowDigest(rowdata, key)
170 if original_checksum == computed_checksum: 171 if original_checksum == computed_checksum:
171 OutputMessage('checksum matches, skipping') 172 OutputMessage('checksum matches, skipping')
172 continue 173 continue
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 regress = (float(trace_values[tracename]['high']) - 261 regress = (float(trace_values[tracename]['high']) -
261 float(trace_values[reftracename]['low'])) 262 float(trace_values[reftracename]['low']))
262 improve = (float(trace_values[tracename]['low']) - 263 improve = (float(trace_values[tracename]['low']) -
263 float(trace_values[reftracename]['high'])) 264 float(trace_values[reftracename]['high']))
264 elif value_type == 'absolute': 265 elif value_type == 'absolute':
265 # Calculate assuming high absolutes are regressions and low absolutes are 266 # Calculate assuming high absolutes are regressions and low absolutes are
266 # improvements. 267 # improvements.
267 regress = float(trace_values[tracename]['high']) 268 regress = float(trace_values[tracename]['high'])
268 improve = float(trace_values[tracename]['low']) 269 improve = float(trace_values[tracename]['low'])
269 270
270 # At this point, regress > improve. If regress == improve, we adjust 271 # So far we've assumed better is lower (regress > improve). If the actual
271 # improve so it is just a little less than regress. I'm picking on improve 272 # values for regress and improve are equal, though, and better was not
272 # so we keep the sizes assumptions in place for now. 273 # specified, alert the user so we don't let them create a new file with
273 if regress == improve: 274 # ambiguous rules.
274 improve = float(regress * 0.99) 275 if better == None and regress == improve:
276 OutputMessage('regress (%s) is equal to improve (%s), and "better" is '
277 'unspecified, please fix by setting "better": "lower" or '
278 '"better": "higher" in this perf trace\'s expectation' % (
279 regress, improve), verbose_message=False)
280 return 1
275 281
276 # If the existing values assume regressions are low deltas relative to 282 # If the existing values assume regressions are low deltas relative to
277 # improvements, swap our regress and improve. This value must be a 283 # improvements, swap our regress and improve. This value must be a
278 # scores-like result. 284 # scores-like result.
279 if ('regress' in perf[key] and 'improve' in perf[key] and 285 if ('regress' in perf[key] and 'improve' in perf[key] and
280 perf[key]['regress'] < perf[key]['improve']): 286 perf[key]['regress'] < perf[key]['improve']):
287 assert(better != 'lower')
288 better = 'higher'
281 temp = regress 289 temp = regress
282 regress = improve 290 regress = improve
283 improve = temp 291 improve = temp
284 if regress < improve: 292 else:
293 assert(better != 'higher')
294 better = 'lower'
295
296 if better == 'higher':
285 regress = int(math.floor(regress - abs(regress*tolerance))) 297 regress = int(math.floor(regress - abs(regress*tolerance)))
286 improve = int(math.ceil(improve + abs(improve*tolerance))) 298 improve = int(math.ceil(improve + abs(improve*tolerance)))
287 else: 299 else:
288 improve = int(math.floor(improve - abs(improve*tolerance))) 300 improve = int(math.floor(improve - abs(improve*tolerance)))
289 regress = int(math.ceil(regress + abs(regress*tolerance))) 301 regress = int(math.ceil(regress + abs(regress*tolerance)))
290 302
291 # Calculate the new checksum to test if this is the only thing that may have 303 # Calculate the new checksum to test if this is the only thing that may have
292 # changed. 304 # changed.
293 checksum_rowdata = GetRowData(perf, key) 305 checksum_rowdata = GetRowData(perf, key)
294 new_checksum = GetRowDigest(checksum_rowdata, key) 306 new_checksum = GetRowDigest(checksum_rowdata, key)
(...skipping 16 matching lines...) Expand all
311 WriteJson(perf_file, perf, perfkeys) 323 WriteJson(perf_file, perf, perfkeys)
312 print 'done' 324 print 'done'
313 else: 325 else:
314 if options.verbose: 326 if options.verbose:
315 print '' 327 print ''
316 print 'No changes.' 328 print 'No changes.'
317 329
318 330
319 if __name__ == '__main__': 331 if __name__ == '__main__':
320 sys.exit(Main(sys.argv)) 332 sys.exit(Main(sys.argv))
OLDNEW
« no previous file with comments | « no previous file | tools/perf_expectations/perf_expectations.json » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698