Index: bootperf-bin/perfprinter.py
|
diff --git a/bootperf-bin/perfprinter.py b/bootperf-bin/perfprinter.py
|
new file mode 100644
|
index 0000000000000000000000000000000000000000..d69637016e2e651ece00e0f6c70aaafd14540fc5
|
--- /dev/null
|
+++ b/bootperf-bin/perfprinter.py
|
@@ -0,0 +1,132 @@
|
+# 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:
|
+ <keyname>{perf}=<value>
|
+
|
+ 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
|
|