#!/usr/bin/python # # 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