Home | History | Annotate | Download | only in platform_LibCBench
      1 # Copyright (c) 2010 The Chromium OS 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.
      4 
      5 import glob, logging, re
      6 
      7 from autotest_lib.client.bin import test
      8 from autotest_lib.client.bin import utils
      9 from optparse import OptionParser
     10 
     11 class platform_LibCBench(test.test):
     12     version = 1
     13 
     14     iteration_output = []
     15     GOVERNOR_FILE = '/sys/devices/system/cpu/cpu*/cpufreq/scaling_governor'
     16 
     17     def run_once(self, args=[]):
     18         parser = OptionParser()
     19         parser.add_option('-i',
     20                           '--iterations',
     21                           dest='iterations',
     22                           default=3,
     23                           help='Number of iterations to run.')
     24         parser.add_option('--path',
     25                           dest='path',
     26                           default='/usr/local/libc-bench/libc-bench',
     27                           help='Path to the libc-bench binary.')
     28 
     29         options, args = parser.parse_args(args)
     30 
     31         last_governor_modes = []
     32         governor_paths = glob.glob(self.GOVERNOR_FILE)
     33         for path in governor_paths:
     34             mode = utils.system_output('cat %s' % path)
     35             last_governor_modes.append(mode)
     36             utils.system('sudo bash -c "echo performance > %s"' % path)
     37 
     38         for i in xrange(int(options.iterations)):
     39             self.iteration_output.append(utils.system_output(options.path))
     40 
     41         for i in xrange(len(governor_paths)):
     42             utils.system('sudo bash -c "echo %s > %s"' %
     43                          (last_governor_modes[i], governor_paths[i]))
     44 
     45     def postprocess_iteration(self):
     46         results = {}
     47 
     48         current_benchmark = None
     49         # Process the output of the benchmarks.
     50         # Output for each benchmark looks like the following:
     51         # b_<benchmark_1>
     52         #   time: ..., x: ..., y: ..., z: ...
     53         for output in self.iteration_output:
     54             for line in output.split('\n'):
     55                 if line.startswith('b_'):
     56                     current_benchmark = line
     57                 elif line.strip().startswith('time'):
     58                     time = float(line.strip().split(',')[0].split(' ')[1])
     59                     assert(current_benchmark is not None)
     60                     results.setdefault(current_benchmark, []).append(time)
     61 
     62         perf_results = {}
     63         for benchmark in results:
     64             average = sum(results[benchmark]) / len(results[benchmark])
     65             minimum = min(results[benchmark])
     66             maximum = max(results[benchmark])
     67             difference = maximum - minimum
     68             percent_difference = difference / average * 100
     69 
     70 
     71             logging.info('%s:\tmin=%s\tmax=%s\tdiff=%s\tavg=%s\tpercent=%s' %
     72                          (benchmark, minimum, maximum, difference, average,
     73                           percent_difference))
     74 
     75             key_string = re.sub('[^\w]', '_', benchmark)
     76             perf_results[key_string] = average
     77 
     78 
     79         self.write_perf_keyval(perf_results)
     80