gen_bench_ranges.py revision 363e546ed626b6dbbc42f5db87b3594bc0b5944b
1363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#!/usr/bin/env python
2363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger# Copyright (c) 2012 The Chromium Authors. All rights reserved.
3363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger# Use of this source code is governed by a BSD-style license that can be found
4363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger# in the LICENSE file.
5363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
6363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger""" Analyze recent SkPicture bench data, and output suggested ranges.
7363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
8363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerThe outputs can be edited and pasted to bench_expectations.txt to trigger
9363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerbuildbot alerts if the actual benches are out of range. Details are documented
10363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerin the .txt file.
11363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
12363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerCurrently the easiest way to update bench_expectations.txt is to delete all skp
13363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerbench lines, run this script, and redirect outputs (">>") to be added to the
14363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger.txt file.
15363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerTODO(bensong): find a better way for updating the bench lines in place.
16363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
17363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerNote: since input data are stored in Google Storage, you will need to set up
18363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerthe corresponding library.
19363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerSee http://developers.google.com/storage/docs/gspythonlibrary for details.
20363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger"""
21363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
22363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger__author__ = 'bensong@google.com (Ben Chen)'
23363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
24363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerimport bench_util
25363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerimport boto
26363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerimport cStringIO
27363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerimport optparse
28363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerimport re
29363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerimport shutil
30363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
31363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerfrom oauth2_plugin import oauth2_plugin
32363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
33363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
34363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger# Ratios for calculating suggested picture bench upper and lower bounds.
35363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerBENCH_UB = 1.1  # Allow for 10% room for normal variance on the up side.
36363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerBENCH_LB = 0.85
37363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
38363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger# Further allow for a fixed amount of noise. This is especially useful for
39363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger# benches of smaller absolute value. Keeping this value small will not affect
40363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger# performance tunings.
41363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerBENCH_ALLOWED_NOISE = 10
42363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
43363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger# List of platforms to track.
44363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerPLATFORMS = ['Mac_Float_Bench_32',
45363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger             'Nexus10_4-1_Float_Bench_32',
46363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger             'Shuttle_Ubuntu12_ATI5770_Float_Bench_32',
47363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            ]
48363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
49363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger# Filter for configs of no interest. They are old config names replaced by more
50363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger# specific ones.
51363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerCONFIGS_TO_FILTER = ['gpu', 'raster']
52363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
53363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger# Template for gsutil uri.
54363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerGOOGLE_STORAGE_URI_SCHEME = 'gs'
55363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerURI_BUCKET = 'chromium-skia-gm'
56363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
57363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger# Constants for optparse.
58363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerUSAGE_STRING = 'USAGE: %s [options]'
59363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerHOWTO_STRING = """
60363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerFeel free to revise PLATFORMS for your own needs. The default is the most common
61363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergercombination that we care most about. Platforms that did not run bench_pictures
62363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerin the given revision range will not have corresponding outputs.
63363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerPlease check http://go/skpbench to choose a range that fits your needs.
64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerBENCH_UB, BENCH_LB and BENCH_ALLOWED_NOISE can be changed to expand or narrow
65363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerthe permitted bench ranges without triggering buidbot alerts.
66363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger"""
67363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerHELP_STRING = """
68363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerOutputs expectation picture bench ranges for the latest revisions for the given
69363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerrevision range. For instance, --rev_range=6000:6000 will return only bench
70363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerranges for the bots that ran bench_pictures at rev 6000; --rev-range=6000:7000
71363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergermay have multiple bench data points for each bench configuration, and the code
72363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerreturns bench data for the latest revision of all available (closer to 7000).
73363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger""" + HOWTO_STRING
74363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
75363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerOPTION_REVISION_RANGE = '--rev-range'
76363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerOPTION_REVISION_RANGE_SHORT = '-r'
77363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger# Bench bench representation algorithm flag.
78363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerOPTION_REPRESENTATION_ALG = '--algorithm'
79363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerOPTION_REPRESENTATION_ALG_SHORT = '-a'
80363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
81363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger# List of valid representation algorithms.
82363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerREPRESENTATION_ALGS = ['avg', 'min', 'med', '25th']
83363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
84363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerdef OutputSkpBenchExpectations(rev_min, rev_max, representation_alg):
85363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger  """Reads skp bench data from google storage, and outputs expectations.
86363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
87363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger  Ignores data with revisions outside [rev_min, rev_max] integer range. For
88363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger  bench data with multiple revisions, we use higher revisions to calculate
89363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger  expected bench values.
90363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger  Uses the provided representation_alg for calculating bench representations.
91363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger  """
92363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger  expectation_dic = {}
93363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger  uri = boto.storage_uri(URI_BUCKET, GOOGLE_STORAGE_URI_SCHEME)
94363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger  for obj in uri.get_bucket():
95363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    # Filters out non-skp-bench files.
96363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    if (not obj.name.startswith('perfdata/Skia_') or
97363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        obj.name.find('_data_skp_') < 0):
98363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger      continue
99363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    # Ignores uninterested platforms.
100363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    platform = obj.name.split('/')[1][5:]  # Removes "Skia_" prefix.
101363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    if platform not in PLATFORMS:
102363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger      continue
103363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    # Filters by revision.
104363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    for rev in range(rev_min, rev_max + 1):
105363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger      if '_r%s_' % rev not in obj.name:
106363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        continue
107363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
108363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    contents = cStringIO.StringIO()
109363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    obj.get_file(contents)
110363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    for point in bench_util.parse('', contents.getvalue().split('\n'),
111363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                                  representation_alg):
112363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger      if point.config in CONFIGS_TO_FILTER:
113363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        continue
114363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger      # TODO(bensong): the filtering below is only needed during skp generation
115363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger      # system transitioning. Change it once the new system (bench name starts
116363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger      # with http) is stable for the switch-over, and delete it once we
117363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger      # deprecate the old ones.
118363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger      if point.bench.startswith('http'):
119363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        continue
120363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
121363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger      key = '%s_%s_%s,%s-%s' % (point.bench, point.config, point.time_type,
122363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                                platform, representation_alg)
123363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger      # It is fine to have later revisions overwrite earlier benches, since we
124363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger      # only use the latest bench within revision range to set expectations.
125363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger      expectation_dic[key] = point.time
126363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger  keys = expectation_dic.keys()
127363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger  keys.sort()
128363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger  for key in keys:
129363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    bench_val = expectation_dic[key]
130363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    # Prints out expectation lines.
131363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    print '%s,%.3f,%.3f,%.3f' % (key, bench_val,
132363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                                 bench_val * BENCH_LB - BENCH_ALLOWED_NOISE,
133363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                                 bench_val * BENCH_UB + BENCH_ALLOWED_NOISE)
134363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
135363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerdef main():
136363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger  """Parses flags and outputs expected Skia picture bench results."""
137363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger  parser = optparse.OptionParser(USAGE_STRING % '%prog' + HELP_STRING)
138363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger  parser.add_option(OPTION_REVISION_RANGE_SHORT, OPTION_REVISION_RANGE,
139363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger      dest='rev_range',
140363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger      help='(Mandatory) revision range separated by ":", e.g., 6000:6005')
141363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger  parser.add_option(OPTION_REPRESENTATION_ALG_SHORT, OPTION_REPRESENTATION_ALG,
142363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger      dest='alg', default='25th',
143363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger      help=('Bench representation algorithm. One of '
144363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            '%s. Default to "25th".' % str(REPRESENTATION_ALGS)))
145363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger  (options, args) = parser.parse_args()
146363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger  if options.rev_range:
147363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    range_match = re.search('(\d+)\:(\d+)', options.rev_range)
148363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    if not range_match:
149363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger      parser.error('Wrong format for rev-range [%s]' % options.rev_range)
150363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    else:
151363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger      rev_min = int(range_match.group(1))
152363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger      rev_max = int(range_match.group(2))
153363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger      OutputSkpBenchExpectations(rev_min, rev_max, options.alg)
154363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger  else:
155363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    parser.error('Please provide mandatory flag %s' % OPTION_REVISION_RANGE)
156363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
157363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
158363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerif '__main__' == __name__:
159363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger  main()
160