media/webrtc/trunk/build/android/pylib/perf_tests_helper.py

Wed, 31 Dec 2014 13:27:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 13:27:57 +0100
branch
TOR_BUG_3246
changeset 6
8bccb770b82d
permissions
-rw-r--r--

Ignore runtime configuration files generated during quality assurance.

     1 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
     2 # Use of this source code is governed by a BSD-style license that can be
     3 # found in the LICENSE file.
     5 import re
     7 import android_commands
     8 import math
    10 # Valid values of result type.
    11 RESULT_TYPES = {'unimportant': 'RESULT ',
    12                 'default': '*RESULT ',
    13                 'informational': ''}
    16 def _EscapePerfResult(s):
    17   """Escapes |s| for use in a perf result."""
    18   # Colons (:) and equal signs (=) are not allowed, and we chose an arbitrary
    19   # limit of 40 chars.
    20   return re.sub(':|=', '_', s[:40])
    23 def PrintPerfResult(measurement, trace, values, units, result_type='default',
    24                     print_to_stdout=True):
    25   """Prints numerical data to stdout in the format required by perf tests.
    27   The string args may be empty but they must not contain any colons (:) or
    28   equals signs (=).
    30   Args:
    31     measurement: A description of the quantity being measured, e.g. "vm_peak".
    32     trace: A description of the particular data point, e.g. "reference".
    33     values: A list of numeric measured values.
    34     units: A description of the units of measure, e.g. "bytes".
    35     result_type: A  tri-state that accepts values of ['unimportant', 'default',
    36         'informational']. 'unimportant' prints RESULT, 'default' prints *RESULT
    37         and 'informational' prints nothing.
    38     print_to_stdout: If True, prints the output in stdout instead of returning
    39         the output to caller.
    41     Returns:
    42       String of the formated perf result.
    43   """
    44   assert result_type in RESULT_TYPES, 'result type: %s is invalid' % result_type
    46   assert isinstance(values, list)
    47   assert len(values)
    48   assert '/' not in measurement
    49   avg = None
    50   sd = None
    51   if len(values) > 1:
    52     try:
    53       value = '[%s]' % ','.join([str(v) for v in values])
    54       avg = sum([float(v) for v in values]) / len(values)
    55       sqdiffs = [(float(v) - avg) ** 2 for v in values]
    56       variance = sum(sqdiffs) / (len(values) - 1)
    57       sd = math.sqrt(variance)
    58     except ValueError:
    59       value = ", ".join(values)
    60   else:
    61     value = values[0]
    63   trace_name = _EscapePerfResult(trace)
    64   output = '%s%s: %s%s%s %s' % (
    65     RESULT_TYPES[result_type],
    66     _EscapePerfResult(measurement),
    67     trace_name,
    68     # Do not show equal sign if the trace is empty. Usually it happens when
    69     # measurement is enough clear to describe the result.
    70     '= ' if trace_name else '',
    71     value,
    72     units)
    73   if avg:
    74     output += '\nAvg %s: %f%s' % (measurement, avg, units)
    75   if sd:
    76     output += '\nSd  %s: %f%s' % (measurement, sd, units)
    77   if print_to_stdout:
    78     print output
    79   return output
    82 class PerfTestSetup(object):
    83   """Provides methods for setting up a device for perf testing."""
    84   _DROP_CACHES = '/proc/sys/vm/drop_caches'
    85   _SCALING_GOVERNOR = '/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor'
    87   def __init__(self, adb):
    88     self._adb = adb
    89     num_cpus = self._adb.GetFileContents('/sys/devices/system/cpu/online',
    90                                          log_result=False)
    91     assert num_cpus, 'Unable to find /sys/devices/system/cpu/online'
    92     self._num_cpus = int(num_cpus[0].split('-')[-1])
    93     self._original_scaling_governor = None
    95   def DropRamCaches(self):
    96     """Drops the filesystem ram caches for performance testing."""
    97     if not self._adb.IsRootEnabled():
    98       self._adb.EnableAdbRoot()
    99     self._adb.RunShellCommand('sync')
   100     self._adb.RunShellCommand('echo 3 > ' + PerfTestSetup._DROP_CACHES)
   102   def SetUp(self):
   103     """Sets up performance tests."""
   104     if not self._original_scaling_governor:
   105       self._original_scaling_governor = self._adb.GetFileContents(
   106           PerfTestSetup._SCALING_GOVERNOR % 0,
   107           log_result=False)[0]
   108       self._SetScalingGovernorInternal('performance')
   109     self.DropRamCaches()
   111   def TearDown(self):
   112     """Tears down performance tests."""
   113     if self._original_scaling_governor:
   114       self._SetScalingGovernorInternal(self._original_scaling_governor)
   115     self._original_scaling_governor = None
   117   def _SetScalingGovernorInternal(self, value):
   118     for cpu in range(self._num_cpus):
   119       self._adb.RunShellCommand(
   120           ('echo %s > ' + PerfTestSetup._SCALING_GOVERNOR) % (value, cpu))

mercurial