| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env 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 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 74 return text | 74 return text |
| 75 | 75 |
| 76 | 76 |
| 77 def GetRowData(data, key): | 77 def GetRowData(data, key): |
| 78 rowdata = [] | 78 rowdata = [] |
| 79 # reva and revb always come first. | 79 # reva and revb always come first. |
| 80 for subkey in ['reva', 'revb']: | 80 for subkey in ['reva', 'revb']: |
| 81 if subkey in data[key]: | 81 if subkey in data[key]: |
| 82 rowdata.append('"%s": %s' % (subkey, data[key][subkey])) | 82 rowdata.append('"%s": %s' % (subkey, data[key][subkey])) |
| 83 # Strings, like type, come next. | 83 # Strings, like type, come next. |
| 84 for subkey in ['type']: | 84 for subkey in ['type', 'better']: |
| 85 if subkey in data[key]: | 85 if subkey in data[key]: |
| 86 rowdata.append('"%s": "%s"' % (subkey, data[key][subkey])) | 86 rowdata.append('"%s": "%s"' % (subkey, data[key][subkey])) |
| 87 # Finally the main numbers come last. | 87 # Finally the main numbers come last. |
| 88 for subkey in ['improve', 'regress', 'tolerance']: | 88 for subkey in ['improve', 'regress', 'tolerance']: |
| 89 if subkey in data[key]: | 89 if subkey in data[key]: |
| 90 rowdata.append('"%s": %s' % (subkey, data[key][subkey])) | 90 rowdata.append('"%s": %s' % (subkey, data[key][subkey])) |
| 91 return rowdata | 91 return rowdata |
| 92 | 92 |
| 93 | 93 |
| 94 def GetRowDigest(rowdata, key): | 94 def GetRowDigest(rowdata, key): |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 perfkeys = perf.keys() | 158 perfkeys = perf.keys() |
| 159 # In perf_expectations.json, ignore the 'load' key. | 159 # In perf_expectations.json, ignore the 'load' key. |
| 160 perfkeys.remove('load') | 160 perfkeys.remove('load') |
| 161 perfkeys.sort() | 161 perfkeys.sort() |
| 162 | 162 |
| 163 write_new_expectations = False | 163 write_new_expectations = False |
| 164 found_checksum_mismatch = False | 164 found_checksum_mismatch = False |
| 165 for key in perfkeys: | 165 for key in perfkeys: |
| 166 value = perf[key] | 166 value = perf[key] |
| 167 tolerance = value.get('tolerance', DEFAULT_TOLERANCE) | 167 tolerance = value.get('tolerance', DEFAULT_TOLERANCE) |
| 168 better = value.get('better', None) |
| 168 | 169 |
| 169 # Verify the checksum. | 170 # Verify the checksum. |
| 170 original_checksum = value.get('sha1', '') | 171 original_checksum = value.get('sha1', '') |
| 171 if 'sha1' in value: | 172 if 'sha1' in value: |
| 172 del value['sha1'] | 173 del value['sha1'] |
| 173 rowdata = GetRowData(perf, key) | 174 rowdata = GetRowData(perf, key) |
| 174 computed_checksum = GetRowDigest(rowdata, key) | 175 computed_checksum = GetRowDigest(rowdata, key) |
| 175 if original_checksum == computed_checksum: | 176 if original_checksum == computed_checksum: |
| 176 OutputMessage('checksum matches, skipping') | 177 OutputMessage('checksum matches, skipping') |
| 177 continue | 178 continue |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 regress = (float(trace_values[tracename]['high']) - | 270 regress = (float(trace_values[tracename]['high']) - |
| 270 float(trace_values[reftracename]['low'])) | 271 float(trace_values[reftracename]['low'])) |
| 271 improve = (float(trace_values[tracename]['low']) - | 272 improve = (float(trace_values[tracename]['low']) - |
| 272 float(trace_values[reftracename]['high'])) | 273 float(trace_values[reftracename]['high'])) |
| 273 elif value_type == 'absolute': | 274 elif value_type == 'absolute': |
| 274 # Calculate assuming high absolutes are regressions and low absolutes are | 275 # Calculate assuming high absolutes are regressions and low absolutes are |
| 275 # improvements. | 276 # improvements. |
| 276 regress = float(trace_values[tracename]['high']) | 277 regress = float(trace_values[tracename]['high']) |
| 277 improve = float(trace_values[tracename]['low']) | 278 improve = float(trace_values[tracename]['low']) |
| 278 | 279 |
| 279 # At this point, regress > improve. If regress == improve, we adjust | 280 # So far we've assumed better is lower (regress > improve). If the actual |
| 280 # improve so it is just a little less than regress. I'm picking on improve | 281 # values for regress and improve are equal, though, and better was not |
| 281 # so we keep the sizes assumptions in place for now. | 282 # specified, alert the user so we don't let them create a new file with |
| 282 if regress == improve: | 283 # ambiguous rules. |
| 283 improve = float(improve - abs(regress * 0.01)) | 284 if better == None and regress == improve: |
| 285 OutputMessage('regress (%s) is equal to improve (%s), and "better" is ' |
| 286 'unspecified, please fix by setting "better": "lower" or ' |
| 287 '"better": "higher" in this perf trace\'s expectation' % ( |
| 288 regress, improve), verbose_message=False) |
| 289 return 1 |
| 284 | 290 |
| 285 # If the existing values assume regressions are low deltas relative to | 291 # If the existing values assume regressions are low deltas relative to |
| 286 # improvements, swap our regress and improve. This value must be a | 292 # improvements, swap our regress and improve. This value must be a |
| 287 # scores-like result. | 293 # scores-like result. |
| 288 if ('regress' in perf[key] and 'improve' in perf[key] and | 294 if ('regress' in perf[key] and 'improve' in perf[key] and |
| 289 perf[key]['regress'] < perf[key]['improve']): | 295 perf[key]['regress'] < perf[key]['improve']): |
| 296 assert(better != 'lower') |
| 297 better = 'higher' |
| 290 temp = regress | 298 temp = regress |
| 291 regress = improve | 299 regress = improve |
| 292 improve = temp | 300 improve = temp |
| 293 if regress < improve: | 301 else: |
| 302 assert(better != 'higher') |
| 303 better = 'lower' |
| 304 |
| 305 if better == 'higher': |
| 294 regress = int(math.floor(regress - abs(regress*tolerance))) | 306 regress = int(math.floor(regress - abs(regress*tolerance))) |
| 295 improve = int(math.ceil(improve + abs(improve*tolerance))) | 307 improve = int(math.ceil(improve + abs(improve*tolerance))) |
| 296 else: | 308 else: |
| 297 improve = int(math.floor(improve - abs(improve*tolerance))) | 309 improve = int(math.floor(improve - abs(improve*tolerance))) |
| 298 regress = int(math.ceil(regress + abs(regress*tolerance))) | 310 regress = int(math.ceil(regress + abs(regress*tolerance))) |
| 299 | 311 |
| 300 # Calculate the new checksum to test if this is the only thing that may have | 312 # Calculate the new checksum to test if this is the only thing that may have |
| 301 # changed. | 313 # changed. |
| 302 checksum_rowdata = GetRowData(perf, key) | 314 checksum_rowdata = GetRowData(perf, key) |
| 303 new_checksum = GetRowDigest(checksum_rowdata, key) | 315 new_checksum = GetRowDigest(checksum_rowdata, key) |
| (...skipping 23 matching lines...) Expand all Loading... |
| 327 print 'done' | 339 print 'done' |
| 328 else: | 340 else: |
| 329 if options.verbose: | 341 if options.verbose: |
| 330 print '' | 342 print '' |
| 331 print 'No changes.' | 343 print 'No changes.' |
| 332 return 0 | 344 return 0 |
| 333 | 345 |
| 334 | 346 |
| 335 if __name__ == '__main__': | 347 if __name__ == '__main__': |
| 336 sys.exit(Main(sys.argv)) | 348 sys.exit(Main(sys.argv)) |
| OLD | NEW |