Add script to plot flowmon benchmark results
authorGustavo J. A. M. Carneiro <gjc@inescporto.pt>
Tue, 05 May 2009 19:05:46 +0100
changeset 3955 8ca1a875cb1a
parent 3954 51362aaad7b8
child 3957 11bee4872269
Add script to plot flowmon benchmark results
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()