#!/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