#!/usr/bin/python2.7 # Copyright 2015 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. import subprocess import numpy class Error(Exception): """Module error class.""" def GatherPerfStats(program, events): """Run perf stat with the given events and given program. @param program: path to benchmark binary. It should take one argument (number of loop iterations) and produce no output. @param events: value to pass to '-e' arg of perf stat. @returns: List of dicts. """ facts = [] for i in xrange(0, 10): loops = (i + 1) * 10 out = subprocess.check_output( ('perf', 'stat', '-x', ',', '-e', events, program, '%d' % loops), stderr=subprocess.STDOUT) unsupported_events = [] f = {} for line in out.splitlines(): fields = line.split(',') count, unit, event = None, None, None if len(fields) == 2: count, event = fields elif len(fields) == 3: count, unit, event = fields else: raise Error('Unable to parse perf stat output') if count == '<not supported>': unsupported_events.append(event) else: f[event] = int(count) if unsupported_events: raise Error('These events are not supported: %s' % unsupported_events) facts.append(f) return facts