# HG changeset patch # User Gustavo J. A. M. Carneiro # Date 1241546746 -3600 # Node ID 8ca1a875cb1a81d5ceb23a06169439b32361eeb1 # Parent 51362aaad7b8a403198ccfa947b6e82b866cf4e9 Add script to plot flowmon benchmark results diff -r 51362aaad7b8 -r 8ca1a875cb1a utils/flowmon/plot.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/utils/flowmon/plot.py Tue May 05 19:05:46 2009 +0100 @@ -0,0 +1,151 @@ +from optparse import OptionParser +import pylab +try: + from xml.etree import cElementTree as ElementTree +except ImportError: + from xml.etree import ElementTree +import bz2 + + +class ConfidenceValue(object): + + def __init__(self): + self.samples = [] + self._mean = None + self._error = None + + def add_sample(self, sample): + self.samples.append(sample) + + # from http://experimentor.googlecode.com/svn + def _mean_confidence_interval(self, confidence=0.95): + from numpy import mean, array, sqrt + import scipy.stats + a = 1.0*array(self.samples) + n = len(a) + m, se = mean(a), scipy.stats.stderr(a) + # calls the inverse CDF of the Student's t distribution + h = se * scipy.stats.t._ppf((1 + confidence)/2.0, n-1) + self._mean = m + self._error = h + + @property + def mean(self): + if self._mean is None: + self._mean_confidence_interval() + return self._mean + + @property + def error(self): + if self._error is None: + self._mean_confidence_interval() + return self._error + + +class SimulationResults(object): + def __init__(self, results_el): + self.cpu_time = float(results_el.attrib['cpu-time']) + self.run_number = int(results_el.attrib['run-number']) + self.enable_monitor = {"True": True, "False": False} [results_el.attrib['enable-monitor']] + self.max_memory = long(results_el.attrib['max-memory']) + self.num_nodes_side = int(results_el.attrib['num-nodes-side']) + + +class ResultsDb(object): + def __init__(self): + self.simulations = [] + + def read_results_file(self, fname): + tree = ElementTree.ElementTree() + if fname.endswith('.bz2'): + file_obj = bz2.BZ2File(fname) + else: + file_obj = open(fname) + tree.parse(file_obj) + for elem in tree.getroot(): + if elem.tag == 'simulation': + self.simulations.append(SimulationResults(elem)) + + +def main(): + parser = OptionParser() + (options, args) = parser.parse_args() + + results = ResultsDb() + for fname in args: + results.read_results_file(fname) + print "Read %i simulations." % (len(results.simulations),) + + cpu_time_no_monitor = [] + cpu_time_monitor = [] + memory_no_monitor = [] + memory_monitor = [] + + num_nodes_list = [] + + for num_nodes_side in range(3,11): + + num_nodes_list.append(num_nodes_side*num_nodes_side) + + memory_cv_no_monitor = ConfidenceValue() + memory_no_monitor.append(memory_cv_no_monitor) + + memory_cv_monitor = ConfidenceValue() + memory_monitor.append(memory_cv_monitor) + + cpu_cv_no_monitor = ConfidenceValue() + cpu_time_no_monitor.append(cpu_cv_no_monitor) + + cpu_cv_monitor = ConfidenceValue() + cpu_time_monitor.append(cpu_cv_monitor) + + for sim in results.simulations: + if sim.num_nodes_side == num_nodes_side: + if sim.enable_monitor: + memory_cv_monitor.add_sample(sim.max_memory) + cpu_cv_monitor.add_sample(sim.cpu_time) + else: + memory_cv_no_monitor.add_sample(sim.max_memory) + cpu_cv_no_monitor.add_sample(sim.cpu_time) + + pylab.subplot(211) + pylab.title("Memory") + pylab.xlabel("Number of Nodes") + pylab.ylabel("Max. Memory (VSS) (bytes)") + + pylab.errorbar( + num_nodes_list, + [val.mean for val in memory_no_monitor], + [val.error for val in memory_no_monitor], + label="No Monitor", hold=True) + + pylab.errorbar( + num_nodes_list, + [val.mean for val in memory_monitor], + [val.error for val in memory_monitor], + label="With Monitor", hold=True) + pylab.legend(loc='best') + + + pylab.subplot(212) + pylab.title("CPU Time") + pylab.xlabel("Number of Nodes") + pylab.ylabel("Time (s)") + + pylab.errorbar( + num_nodes_list, + [val.mean for val in cpu_time_no_monitor], + [val.error for val in cpu_time_no_monitor], + label="No Monitor", hold=True) + + pylab.errorbar( + num_nodes_list, + [val.mean for val in cpu_time_monitor], + [val.error for val in cpu_time_monitor], + label="With Monitor", hold=True) + pylab.legend(loc='best') + + pylab.show() + +if __name__ == '__main__': + main()