blob: c996719d0b5d85444f7af30c5dbc125e2def6076 [file] [log] [blame]
# Copyright 2012 Google Inc. All Rights Reserved.
"""Parse perf report data for tabulator."""
import os
from utils import perf_diff
def ParsePerfReport(perf_file):
"""It should return a dict."""
return {'cycles': {'foo': 10,
'bar': 20},
'cache_miss': {'foo': 20,
'bar': 10}}
class PerfTable(object):
"""The class to generate dicts for tabulator."""
def __init__(self, experiment, label_names):
self._experiment = experiment
self._label_names = label_names
self.perf_data = {}
self.GenerateData()
# {benchmark:{perf_event1:[[{func1:number, func2:number,
# rows_to_show: number}
# {func1: number, func2: number
# rows_to_show: number}]], ...},
# benchmark2:...}
# The rows_to_show is temp data recording how many
# rows have over 1% running time.
self.row_info = {}
self.GetRowsToShow()
def GenerateData(self):
for label in self._label_names:
for benchmark in self._experiment.benchmarks:
for i in range(1, benchmark.iterations + 1):
dir_name = label + benchmark.name + str(i)
dir_name = filter(str.isalnum, dir_name)
perf_file = os.path.join(self._experiment.results_directory, dir_name,
'perf.data.report.0')
if os.path.exists(perf_file):
self.ReadPerfReport(perf_file, label, benchmark.name, i - 1)
def ReadPerfReport(self, perf_file, label, benchmark_name, iteration):
"""Add the data from one run to the dict."""
if os.path.isfile(perf_file):
perf_of_run = perf_diff.GetPerfDictFromReport(perf_file)
else:
perf_of_run = {}
if benchmark_name not in self.perf_data:
self.perf_data[benchmark_name] = {}
for event in perf_of_run:
self.perf_data[benchmark_name][event] = []
ben_data = self.perf_data[benchmark_name]
label_index = self._label_names.index(label)
for event in ben_data:
while len(ben_data[event]) <= label_index:
ben_data[event].append([])
data_for_label = ben_data[event][label_index]
while len(data_for_label) <= iteration:
data_for_label.append({})
if perf_of_run:
data_for_label[iteration] = perf_of_run[event]
else:
data_for_label[iteration] = {}
def GetRowsToShow(self):
for benchmark in self.perf_data:
if benchmark not in self.row_info:
self.row_info[benchmark] = {}
for event in self.perf_data[benchmark]:
rows = 0
for run in self.perf_data[benchmark][event]:
for iteration in run:
if perf_diff.ROWS_TO_SHOW in iteration:
rows = max(iteration[perf_diff.ROWS_TO_SHOW], rows)
# delete the temp data which stores how many rows of
# the perf data have over 1% running time.
del iteration[perf_diff.ROWS_TO_SHOW]
self.row_info[benchmark][event] = rows