Add script to plot flowmon benchmark results
authorGustavo J. A. M. Carneiro <gjc@inescporto.pt>
Tue May 05 19:05:46 2009 +0100 (9 months ago)
changeset 39558ca1a875cb1a
parent 3954 51362aaad7b8
child 3957 11bee4872269
Add script to plot flowmon benchmark results
utils/flowmon/plot.py
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/utils/flowmon/plot.py	Tue May 05 19:05:46 2009 +0100
     1.3 @@ -0,0 +1,151 @@
     1.4 +from optparse import OptionParser
     1.5 +import pylab
     1.6 +try:
     1.7 +    from xml.etree import cElementTree as ElementTree
     1.8 +except ImportError:
     1.9 +    from xml.etree import ElementTree
    1.10 +import bz2
    1.11 +
    1.12 +
    1.13 +class ConfidenceValue(object):
    1.14 +
    1.15 +    def __init__(self):
    1.16 +        self.samples = []
    1.17 +        self._mean = None
    1.18 +        self._error = None
    1.19 +
    1.20 +    def add_sample(self, sample):
    1.21 +        self.samples.append(sample)
    1.22 +
    1.23 +    # from http://experimentor.googlecode.com/svn
    1.24 +    def _mean_confidence_interval(self, confidence=0.95):
    1.25 +        from numpy import mean, array, sqrt
    1.26 +        import scipy.stats
    1.27 +        a = 1.0*array(self.samples)
    1.28 +        n = len(a)
    1.29 +        m, se = mean(a), scipy.stats.stderr(a)
    1.30 +        # calls the inverse CDF of the Student's t distribution
    1.31 +        h = se * scipy.stats.t._ppf((1 + confidence)/2.0, n-1)
    1.32 +        self._mean = m
    1.33 +        self._error = h
    1.34 +
    1.35 +    @property
    1.36 +    def mean(self):
    1.37 +        if self._mean is None:
    1.38 +            self._mean_confidence_interval()
    1.39 +        return self._mean
    1.40 +
    1.41 +    @property
    1.42 +    def error(self):
    1.43 +        if self._error is None:
    1.44 +            self._mean_confidence_interval()
    1.45 +        return self._error
    1.46 +
    1.47 +
    1.48 +class SimulationResults(object):
    1.49 +    def __init__(self, results_el):
    1.50 +        self.cpu_time = float(results_el.attrib['cpu-time'])
    1.51 +        self.run_number = int(results_el.attrib['run-number'])
    1.52 +        self.enable_monitor = {"True": True, "False": False} [results_el.attrib['enable-monitor']]
    1.53 +        self.max_memory = long(results_el.attrib['max-memory'])
    1.54 +        self.num_nodes_side = int(results_el.attrib['num-nodes-side'])
    1.55 +
    1.56 +
    1.57 +class ResultsDb(object):
    1.58 +    def __init__(self):
    1.59 +        self.simulations = []
    1.60 +
    1.61 +    def read_results_file(self, fname):
    1.62 +        tree = ElementTree.ElementTree()
    1.63 +        if fname.endswith('.bz2'):
    1.64 +            file_obj = bz2.BZ2File(fname)
    1.65 +        else:
    1.66 +            file_obj = open(fname)
    1.67 +        tree.parse(file_obj)
    1.68 +        for elem in tree.getroot():
    1.69 +            if elem.tag == 'simulation':
    1.70 +                self.simulations.append(SimulationResults(elem))
    1.71 +
    1.72 +
    1.73 +def main():
    1.74 +    parser = OptionParser()
    1.75 +    (options, args) = parser.parse_args()
    1.76 +
    1.77 +    results = ResultsDb()
    1.78 +    for fname in args:
    1.79 +        results.read_results_file(fname)
    1.80 +    print "Read %i simulations." % (len(results.simulations),)
    1.81 +
    1.82 +    cpu_time_no_monitor = []
    1.83 +    cpu_time_monitor = []
    1.84 +    memory_no_monitor = []
    1.85 +    memory_monitor = []
    1.86 +
    1.87 +    num_nodes_list = []
    1.88 +
    1.89 +    for num_nodes_side in range(3,11):
    1.90 +
    1.91 +        num_nodes_list.append(num_nodes_side*num_nodes_side)
    1.92 +
    1.93 +        memory_cv_no_monitor = ConfidenceValue()
    1.94 +        memory_no_monitor.append(memory_cv_no_monitor)
    1.95 +
    1.96 +        memory_cv_monitor = ConfidenceValue()
    1.97 +        memory_monitor.append(memory_cv_monitor)
    1.98 +
    1.99 +        cpu_cv_no_monitor = ConfidenceValue()
   1.100 +        cpu_time_no_monitor.append(cpu_cv_no_monitor)
   1.101 +
   1.102 +        cpu_cv_monitor = ConfidenceValue()
   1.103 +        cpu_time_monitor.append(cpu_cv_monitor)
   1.104 +
   1.105 +        for sim in results.simulations:
   1.106 +            if sim.num_nodes_side == num_nodes_side:
   1.107 +                if sim.enable_monitor:
   1.108 +                    memory_cv_monitor.add_sample(sim.max_memory)
   1.109 +                    cpu_cv_monitor.add_sample(sim.cpu_time)
   1.110 +                else:
   1.111 +                    memory_cv_no_monitor.add_sample(sim.max_memory)
   1.112 +                    cpu_cv_no_monitor.add_sample(sim.cpu_time)
   1.113 +
   1.114 +    pylab.subplot(211)
   1.115 +    pylab.title("Memory")
   1.116 +    pylab.xlabel("Number of Nodes")
   1.117 +    pylab.ylabel("Max. Memory (VSS) (bytes)")
   1.118 +
   1.119 +    pylab.errorbar(
   1.120 +        num_nodes_list,
   1.121 +        [val.mean for val in memory_no_monitor],
   1.122 +        [val.error for val in memory_no_monitor],
   1.123 +        label="No Monitor", hold=True)
   1.124 +
   1.125 +    pylab.errorbar(
   1.126 +        num_nodes_list,
   1.127 +        [val.mean for val in memory_monitor],
   1.128 +        [val.error for val in memory_monitor],
   1.129 +        label="With Monitor", hold=True)
   1.130 +    pylab.legend(loc='best')
   1.131 +
   1.132 +
   1.133 +    pylab.subplot(212)
   1.134 +    pylab.title("CPU Time")
   1.135 +    pylab.xlabel("Number of Nodes")
   1.136 +    pylab.ylabel("Time (s)")
   1.137 +
   1.138 +    pylab.errorbar(
   1.139 +        num_nodes_list,
   1.140 +        [val.mean for val in cpu_time_no_monitor],
   1.141 +        [val.error for val in cpu_time_no_monitor],
   1.142 +        label="No Monitor", hold=True)
   1.143 +
   1.144 +    pylab.errorbar(
   1.145 +        num_nodes_list,
   1.146 +        [val.mean for val in cpu_time_monitor],
   1.147 +        [val.error for val in cpu_time_monitor],
   1.148 +        label="With Monitor", hold=True)
   1.149 +    pylab.legend(loc='best')
   1.150 +
   1.151 +    pylab.show()
   1.152 +
   1.153 +if __name__ == '__main__':
   1.154 +    main()