# Copyright (c) 2010 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Routines for printing boot time performance test results.""" import fnmatch import os import os.path import re import resultset _PERF_KEYVAL_PATTERN = re.compile("(.*){perf}=(.*)\n") def ReadKeyvalFile(results, file_): """Read an autotest keyval file, and process the results. The `file_` parameter is a file object with contents in autotest perf keyval format: {perf}= Each iteration of the test is terminated with a single blank line, including the last iteration. Each iteration's results are added to the `results` parameter, which should be an instance of TestResultSet. """ kvd = {} for line in iter(file_): if line == "\n": results.AddIterationResults(kvd) kvd = {} continue m = _PERF_KEYVAL_PATTERN.match(line) if m is None: continue kvd[m.group(1)] = m.group(2) _RESULTS_PATH = ( "summary/platform_BootPerfServer/platform_BootPerfServer/results/keyval") def ReadResultsDirectory(dir_): """Process results from a 'bootperf' output directory. The accumulated results are returned in a newly created TestResultSet object. """ res_set = resultset.TestResultSet(dir_) dirlist = fnmatch.filter(os.listdir(dir_), "run.???") dirlist.sort() for run in dirlist: keyval_path = os.path.join(dir_, run, _RESULTS_PATH) try: kvf = open(keyval_path) except IOError: continue ReadKeyvalFile(res_set, kvf) res_set.FinalizeResults() return res_set def PrintRawData(dirlist, use_timestats, keylist): """Print 'bootperf' results in "raw data" format.""" for dir_ in dirlist: if use_timestats: keyset = ReadResultsDirectory(dir_).TimeKeySet() else: keyset = ReadResultsDirectory(dir_).DiskKeySet() for i in range(0, keyset.num_iterations): if len(dirlist) > 1: line = "%s %3d" % (dir_, i) else: line = "%3d" % i if keylist is not None: markers = keylist else: markers = keyset.markers for stat in markers: (_, v) = keyset.PrintableStatistic(keyset.RawData(stat)[i]) line += " %5s" % str(v) print line def PrintStatisticsSummary(dirlist, use_timestats, keylist): """Print 'bootperf' results in "summary of averages" format.""" if use_timestats: header = "%5s %3s %5s %3s %s" % ( "time", "s%", "dt", "s%", "event") format = "%5s %2d%% %5s %2d%% %s" else: header = "%6s %3s %6s %3s %s" % ( "diskrd", "s%", "delta", "s%", "event") format = "%6s %2d%% %6s %2d%% %s" havedata = False for dir_ in dirlist: if use_timestats: keyset = ReadResultsDirectory(dir_).TimeKeySet() else: keyset = ReadResultsDirectory(dir_).DiskKeySet() if keylist is not None: markers = keylist else: markers = keyset.markers if havedata: print if len(dirlist) > 1: print "%s" % dir_, print "(on %d cycles):" % keyset.num_iterations print header prevvalue = 0 prevstat = None for stat in markers: (valueavg, valuedev) = keyset.Statistics(stat) valuepct = int(100 * valuedev / valueavg + 0.5) if prevstat: (deltaavg, deltadev) = keyset.DeltaStatistics(prevstat, stat) deltapct = int(100 * deltadev / deltaavg + 0.5) else: deltapct = valuepct (valstring, val_printed) = keyset.PrintableStatistic(valueavg) delta = val_printed - prevvalue (deltastring, _) = keyset.PrintableStatistic(delta) print format % (valstring, valuepct, "+" + deltastring, deltapct, stat) prevvalue = val_printed prevstat = stat havedata = True