| Index: bench/gen_skp_ranges.py
|
| ===================================================================
|
| --- bench/gen_skp_ranges.py (revision 9529)
|
| +++ bench/gen_skp_ranges.py (working copy)
|
| @@ -1,166 +0,0 @@
|
| -#!/usr/bin/env python
|
| -# Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be found
|
| -# in the LICENSE file.
|
| -
|
| -""" Analyze recent SkPicture bench data, and output suggested ranges.
|
| -
|
| -The outputs can be edited and pasted to bench_expectations.txt to trigger
|
| -buildbot alerts if the actual benches are out of range. Details are documented
|
| -in the .txt file.
|
| -
|
| -Currently the easiest way to update bench_expectations.txt is to delete all skp
|
| -bench lines, run this script, and redirect outputs (">>") to be added to the
|
| -.txt file.
|
| -TODO(bensong): find a better way for updating the bench lines in place.
|
| -
|
| -Note: since input data are stored in Google Storage, you will need to set up
|
| -the corresponding library.
|
| -See http://developers.google.com/storage/docs/gspythonlibrary for details.
|
| -"""
|
| -
|
| -__author__ = 'bensong@google.com (Ben Chen)'
|
| -
|
| -import bench_util
|
| -import boto
|
| -import cStringIO
|
| -import optparse
|
| -import re
|
| -import shutil
|
| -
|
| -from oauth2_plugin import oauth2_plugin
|
| -
|
| -
|
| -# Ratios for calculating suggested picture bench upper and lower bounds.
|
| -BENCH_UB = 1.1 # Allow for 10% room for normal variance on the up side.
|
| -BENCH_LB = 0.9
|
| -
|
| -# Further allow for a fixed amount of noise. This is especially useful for
|
| -# benches of smaller absolute value. Keeping this value small will not affect
|
| -# performance tunings.
|
| -BENCH_ALLOWED_NOISE = 10
|
| -
|
| -# Name prefix for benchmark builders.
|
| -BENCH_BUILDER_PREFIX = 'Perf-'
|
| -
|
| -# List of platforms to track. Feel free to change it to meet your needs.
|
| -PLATFORMS = ['Perf-Mac10.8-MacMini4.1-GeForce320M-x86-Release',
|
| - 'Perf-Android-Nexus7-Tegra3-Arm7-Release',
|
| - 'Perf-Ubuntu12-ShuttleA-ATI5770-x86-Release',
|
| - 'Perf-Win7-ShuttleA-HD2000-x86-Release',
|
| - ]
|
| -
|
| -# Filter for configs of no interest. They are old config names replaced by more
|
| -# specific ones.
|
| -CONFIGS_TO_FILTER = ['gpu', 'raster']
|
| -
|
| -# Template for gsutil uri.
|
| -GOOGLE_STORAGE_URI_SCHEME = 'gs'
|
| -URI_BUCKET = 'chromium-skia-gm'
|
| -
|
| -# Constants for optparse.
|
| -USAGE_STRING = 'USAGE: %s [options]'
|
| -HOWTO_STRING = """
|
| -Feel free to revise PLATFORMS for your own needs. The default is the most common
|
| -combination that we care most about. Platforms that did not run bench_pictures
|
| -in the given revision range will not have corresponding outputs.
|
| -Please check http://go/skpbench to choose a range that fits your needs.
|
| -BENCH_UB, BENCH_LB and BENCH_ALLOWED_NOISE can be changed to expand or narrow
|
| -the permitted bench ranges without triggering buidbot alerts.
|
| -"""
|
| -HELP_STRING = """
|
| -Outputs expectation picture bench ranges for the latest revisions for the given
|
| -revision range. For instance, --rev_range=6000:6000 will return only bench
|
| -ranges for the bots that ran bench_pictures at rev 6000; --rev-range=6000:7000
|
| -may have multiple bench data points for each bench configuration, and the code
|
| -returns bench data for the latest revision of all available (closer to 7000).
|
| -""" + HOWTO_STRING
|
| -
|
| -OPTION_REVISION_RANGE = '--rev-range'
|
| -OPTION_REVISION_RANGE_SHORT = '-r'
|
| -# Bench bench representation algorithm flag.
|
| -OPTION_REPRESENTATION_ALG = '--algorithm'
|
| -OPTION_REPRESENTATION_ALG_SHORT = '-a'
|
| -
|
| -# List of valid representation algorithms.
|
| -REPRESENTATION_ALGS = ['avg', 'min', 'med', '25th']
|
| -
|
| -def OutputSkpBenchExpectations(rev_min, rev_max, representation_alg):
|
| - """Reads skp bench data from google storage, and outputs expectations.
|
| -
|
| - Ignores data with revisions outside [rev_min, rev_max] integer range. For
|
| - bench data with multiple revisions, we use higher revisions to calculate
|
| - expected bench values.
|
| - Uses the provided representation_alg for calculating bench representations.
|
| - """
|
| - expectation_dic = {}
|
| - uri = boto.storage_uri(URI_BUCKET, GOOGLE_STORAGE_URI_SCHEME)
|
| - for obj in uri.get_bucket():
|
| - # Filters out non-skp-bench files.
|
| - if ((not obj.name.startswith('perfdata/%s' % BENCH_BUILDER_PREFIX) and
|
| - not obj.name.startswith(
|
| - 'playback/perfdata/%s' % BENCH_BUILDER_PREFIX)) or
|
| - obj.name.find('_data_skp_') < 0):
|
| - continue
|
| - # Ignores uninterested platforms.
|
| - platform = obj.name.split('/')[1]
|
| - if not platform.startswith(BENCH_BUILDER_PREFIX):
|
| - platform = obj.name.split('/')[2]
|
| - if not platform.startswith(BENCH_BUILDER_PREFIX):
|
| - continue # Ignores non-platform object
|
| - if platform not in PLATFORMS:
|
| - continue
|
| - # Filters by revision.
|
| - to_filter = True
|
| - for rev in range(rev_min, rev_max + 1):
|
| - if '_r%s_' % rev in obj.name:
|
| - to_filter = False
|
| - break
|
| - if to_filter:
|
| - continue
|
| - contents = cStringIO.StringIO()
|
| - obj.get_file(contents)
|
| - for point in bench_util.parse('', contents.getvalue().split('\n'),
|
| - representation_alg):
|
| - if point.config in CONFIGS_TO_FILTER:
|
| - continue
|
| -
|
| - key = '%s_%s_%s,%s-%s' % (point.bench, point.config, point.time_type,
|
| - platform, representation_alg)
|
| - # It is fine to have later revisions overwrite earlier benches, since we
|
| - # only use the latest bench within revision range to set expectations.
|
| - expectation_dic[key] = point.time
|
| - keys = expectation_dic.keys()
|
| - keys.sort()
|
| - for key in keys:
|
| - bench_val = expectation_dic[key]
|
| - # Prints out expectation lines.
|
| - print '%s,%.3f,%.3f,%.3f' % (key, bench_val,
|
| - bench_val * BENCH_LB - BENCH_ALLOWED_NOISE,
|
| - bench_val * BENCH_UB + BENCH_ALLOWED_NOISE)
|
| -
|
| -def main():
|
| - """Parses flags and outputs expected Skia picture bench results."""
|
| - parser = optparse.OptionParser(USAGE_STRING % '%prog' + HELP_STRING)
|
| - parser.add_option(OPTION_REVISION_RANGE_SHORT, OPTION_REVISION_RANGE,
|
| - dest='rev_range',
|
| - help='(Mandatory) revision range separated by ":", e.g., 6000:6005')
|
| - parser.add_option(OPTION_REPRESENTATION_ALG_SHORT, OPTION_REPRESENTATION_ALG,
|
| - dest='alg', default='25th',
|
| - help=('Bench representation algorithm. One of '
|
| - '%s. Default to "25th".' % str(REPRESENTATION_ALGS)))
|
| - (options, args) = parser.parse_args()
|
| - if options.rev_range:
|
| - range_match = re.search('(\d+)\:(\d+)', options.rev_range)
|
| - if not range_match:
|
| - parser.error('Wrong format for rev-range [%s]' % options.rev_range)
|
| - else:
|
| - rev_min = int(range_match.group(1))
|
| - rev_max = int(range_match.group(2))
|
| - OutputSkpBenchExpectations(rev_min, rev_max, options.alg)
|
| - else:
|
| - parser.error('Please provide mandatory flag %s' % OPTION_REVISION_RANGE)
|
| -
|
| -
|
| -if '__main__' == __name__:
|
| - main()
|
|
|