139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania#!/usr/bin/python2.5
239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania#
3d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# Copyright 2009, The Android Open Source Project
4d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania#
5d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# Licensed under the Apache License, Version 2.0 (the "License");
6d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# you may not use this file except in compliance with the License.
7d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# You may obtain a copy of the License at
8d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania#
9d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania#     http://www.apache.org/licenses/LICENSE-2.0
10d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania#
11d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# Unless required by applicable law or agreed to in writing, software
12d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# distributed under the License is distributed on an "AS IS" BASIS,
13d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# See the License for the specific language governing permissions and
15d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# limitations under the License.
16d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
1739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
1839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania"""plot_sdcard: A module to plot the results of an sdcard perf test.
1939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
2039c016f875b793296a121f41de5775b88f6fa1c9Nicolas CataniaRequires Gnuplot python v 1.8
2139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
2239c016f875b793296a121f41de5775b88f6fa1c9Nicolas CataniaTypical usage:
23d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania -t x axis is time
24d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania -i x axis is iteration
25d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania -p profile data generated by profile_sdcard.sh
26d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
27d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania./plot_sdcard.py -t /tmp/data.txt
28d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania./plot_sdcard.py -i /tmp/data.txt
29d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania./plot_sdcard.py -p
3039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
31d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniapython interpreter
3239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania>>> import plot_sdcard as p
33d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania>>> (metadata, data) = p.Parse('/tmp/data.txt')
34d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania>>> p.PlotIterations(metadata, data)
35d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania>>> p.PlotTimes(metadata, data)
3639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
3739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania"""
3839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
39d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniaimport getopt
4039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniafrom itertools import izip
41d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniaimport re
42d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniaimport sys
43d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniaimport Gnuplot
44d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniaimport numpy
45d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
4639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
4739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniaclass DataSet(object):
48d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  """Dataset holds the summary and data (time,value pairs)."""
49d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
5039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania  def __init__(self, line):
51d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    res = re.search(('# StopWatch ([\w]+) total/cumulative '
52d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania                     'duration ([0-9.]+). Samples: ([0-9]+)'), line)
5339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    self.time = []
5439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    self.data = []
5539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    self.name = res.group(1)
5639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    self.duration = float(res.group(2))
5739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    self.iteration = int(res.group(3))
5839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    self.summary = re.match('([a-z_]+)_total', self.name)
5939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
6039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania  def __repr__(self):
6139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    return str(zip(self.time, self.data))
6239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
63d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  def Add(self, time, value):
6439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    self.time.append(time)
6539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    self.data.append(value)
6639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
67d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  def RescaleTo(self, length):
6839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    factor = len(self.data) / length
6939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
7039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if factor > 1:
7139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      new_time = []
7239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      new_data = []
7339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      accum = 0.0
7439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      idx = 1
75d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania      for t, d in izip(self.time, self.data):
7639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        accum += d
7739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        if idx % factor == 0:
7839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania          new_time.append(t)
7939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania          new_data.append(accum / factor)
8039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania          accum = 0
8139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        idx += 1
8239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      self.time = new_time
8339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      self.data = new_data
8439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
8539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
8639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniaclass Metadata(object):
8739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania  def __init__(self):
8839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    self.kernel = ''
8939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    self.command_line = ''
9039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    self.sched = ''
9139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    self.name = ''
9239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    self.fadvise = ''
9339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    self.iterations = 0
9439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    self.duration = 0.0
9539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    self.complete = False
9639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
97d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  def Parse(self, line):
9839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if line.startswith('# Kernel:'):
99906d825d7033339bb37d7415bce77089bec3a2b6Nicolas Catania      self.kernel = re.search('Linux version ([0-9.]+-[^ ]+)', line).group(1)
10039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    elif line.startswith('# Command:'):
10139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      self.command_line = re.search('# Command: [/\w_]+ (.*)', line).group(1)
10239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      self.command_line = self.command_line.replace(' --', '-')
10339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      self.command_line = self.command_line.replace(' -d', '')
10439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      self.command_line = self.command_line.replace('--test=', '')
10539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    elif line.startswith('# Iterations'):
10639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      self.iterations = int(re.search('# Iterations: ([0-9]+)', line).group(1))
10739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    elif line.startswith('# Fadvise'):
108d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania      self.fadvise = re.search('# Fadvise: ([\w]+)', line).group(1)
109d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    elif line.startswith('# Sched'):
11039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      self.sched = re.search('# Sched features: ([\w]+)', line).group(1)
11139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      self.complete = True
11239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
113d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  def AsTitle(self):
114d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    return '%s-duration:%f\\n-%s\\n%s' % (
115d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania        self.kernel, self.duration, self.command_line, self.sched)
11639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
117d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  def UpdateWith(self, dataset):
11839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    self.duration = max(self.duration, dataset.duration)
11939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    self.name = dataset.name
12039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
12139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
122d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniadef Parse(filename):
123d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  """Parse a file with the collected data.
12439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
125d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  The data must be in 2 rows (x,y).
12639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
127d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  Args:
128d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    filename: Full path to the file.
129d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  """
13039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
13139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania  f = open(filename, 'r')
13239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
13339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania  metadata = Metadata()
13439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania  data = []  # array of dataset
13539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania  dataset = None
13639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
13739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania  for num, line in enumerate(f):
13839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    try:
13939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      line = line.strip()
14039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      if not line: continue
14139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
14239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      if not metadata.complete:
143d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania        metadata.Parse(line)
14439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        continue
14539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
14639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      if re.match('[a-z_]', line):
14739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        continue
14839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
149d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania      if line.startswith('# StopWatch'):  # Start of a new dataset
15039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        if dataset:
15139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania          if dataset.summary:
152d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania            metadata.UpdateWith(dataset)
15339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania          else:
15439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            data.append(dataset)
15539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
15639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        dataset = DataSet(line)
15739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        continue
15839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
15939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      if line.startswith('#'):
16039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        continue
16139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
16239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      # must be data at this stage
16339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      try:
16439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        (time, value) = line.split(None, 1)
16539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      except ValueError:
166d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania        print 'skipping line %d: %s' % (num, line)
16739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        continue
16839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
16939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      if dataset and not dataset.summary:
170d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania        dataset.Add(float(time), float(value))
17139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
172d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    except Exception:
173d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania      print 'Error parsing line %d' % num, sys.exc_info()[0]
17439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      raise
17539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania  data.append(dataset)
176d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  if not metadata.complete:
177d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    print """Error missing metadata. Did you mount debugfs?
178d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    [adb shell mount -t debugfs none /sys/kernel/debug]"""
179d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    sys.exit(1)
18039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania  return (metadata, data)
181d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
182d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
183d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniadef PlotIterations(metadata, data):
184d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  """Plot the duration of the ops against iteration.
185d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
186d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  If you are plotting data with widely different runtimes you probably want to
187d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  use PlotTimes instead.
188d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
189d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  For instance when readers and writers are in the same mix, the
190d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  readers will go thru 100 iterations much faster than the
191d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  writers. The load test tries to be smart about that but the final
192d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  iterations of the writers will likely be done w/o any influence from
193d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  the readers.
194d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
195d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  Args:
196d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    metadata: For the graph's title.
197d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    data: pair of to be plotted.
198d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  """
199d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
200d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp = Gnuplot.Gnuplot(persist=1)
201d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp('set data style lines')
202d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp.clear()
203d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp.xlabel('iterations')
204d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp.ylabel('duration in second')
205d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp.title(metadata.AsTitle())
206d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  styles = {}
207d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  line_style = 1
208d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
209d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  for dataset in data:
210d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    dataset.RescaleTo(metadata.iterations)
211d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    x = numpy.arange(len(dataset.data), dtype='int_')
212d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    if not dataset.name in styles:
213d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania      styles[dataset.name] = line_style
214d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania      line_style += 1
215d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania      d = Gnuplot.Data(x, dataset.data,
216d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania                       title=dataset.name,
217d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania                       with_='lines ls %d' % styles[dataset.name])
218d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    else:  # no need to repeat a title that exists already.
219d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania      d = Gnuplot.Data(x, dataset.data,
220d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania                       with_='lines ls %d' % styles[dataset.name])
221d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
222d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    gp.replot(d)
223d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp.hardcopy('/tmp/%s-%s-%f.png' %
224d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania              (metadata.name, metadata.kernel, metadata.duration),
225d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania              terminal='png')
226d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
227d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
228d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniadef PlotTimes(metadata, data):
229d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  """Plot the duration of the ops against time elapsed.
230d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
231d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  Args:
232d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    metadata: For the graph's title.
233d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    data: pair of to be plotted.
234d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  """
235d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
236d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp = Gnuplot.Gnuplot(persist=1)
237d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp('set data style impulses')
238d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp('set xtics 1')
239d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp.clear()
240d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp.xlabel('seconds')
241d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp.ylabel('duration in second')
242d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp.title(metadata.AsTitle())
243d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  styles = {}
244d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  line_style = 1
245d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
246d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  for dataset in data:
247d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    x = numpy.array(dataset.time, dtype='float_')
248d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    if not dataset.name in styles:
249d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania      styles[dataset.name] = line_style
250d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania      line_style += 1
251d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania      d = Gnuplot.Data(x, dataset.data,
252d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania                       title=dataset.name,
253d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania                       with_='impulses ls %d' % styles[dataset.name])
254d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    else:  # no need to repeat a title that exists already.
255d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania      d = Gnuplot.Data(x, dataset.data,
256d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania                       with_='impulses ls %d' % styles[dataset.name])
257d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
258d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    gp.replot(d)
259d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp.hardcopy('/tmp/%s-%s-%f.png' %
260d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania              (metadata.name, metadata.kernel, metadata.duration),
261d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania              terminal='png')
262d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
263d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
264d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniadef PlotProfile():
265d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  """Plot the time of a run against the number of processes."""
266d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  (metadata, data) = Parse('/tmp/sdcard-scalability.txt')
267d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp = Gnuplot.Gnuplot(persist=1)
268d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp('set data style impulses')
269d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp('set xtics 1')
270d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp('set pointsize 2')
271d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp.clear()
272d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp.xlabel('writer process')
273d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp.ylabel('duration in second')
274d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp.title(metadata.AsTitle())
275d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
276d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  dataset = data[0]
277d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  x = numpy.array(dataset.time, dtype='int_')
278d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  d = Gnuplot.Data(x, dataset.data,
279d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania                   title=dataset.name,
280d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania                   with_='linespoints')
281d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp.replot(d)
282d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  gp.hardcopy('/tmp/%s-%s-%f.png' %
283d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania              (metadata.name, metadata.kernel, metadata.duration),
284d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania              terminal='png')
285d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
286d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
287d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniadef Usage():
288d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  """Print this module's usage."""
289d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  print """
290d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  To plot the result using the iter number of the x axis:
291d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
292d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    plot_sdcard.py -i /tmp/data.txt
293d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
294d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  To plot the result using time for the x axis:
295d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
296d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    plot_sdcard.py -t /tmp/data.txt
297d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
298d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  To plot the result from the profiler:
299d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
300d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    profile_sdcard.sh
301d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    plot_sdcard.py -p
302d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
303d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  """
304d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  sys.exit(2)
305d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
306d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
307d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniadef main(argv):
308d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  try:
309d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    (optlist, args) = getopt.getopt(argv[1:],
310d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania                                    'itp', ['iteration', 'time', 'profile'])
311d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  except getopt.GetoptError, err:
312d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    print str(err)
313d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    Usage()
314d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
315d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  for flag, val in optlist:
316d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    if flag in ('-i', '--iteration'):
317d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania      (metadata, data) = Parse(args[0])
318d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania      PlotIterations(metadata, data)
319d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania      sys.exit(0)
320d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    elif flag in ('-t', '--time'):
321d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania      (metadata, data) = Parse(args[0])
322d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania      PlotTimes(metadata, data)
323d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania      sys.exit(0)
324d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    elif flag in ('-p', '--profile'):
325d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania      PlotProfile()
326d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania      sys.exit(0)
327d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  Usage()
328d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
329d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania
330d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniaif __name__ == '__main__':
331d989a8e37771a2f97b1c6ec45f29bb1bc94e7299Nicolas Catania  if Gnuplot.__version__ != "1.8":
332d989a8e37771a2f97b1c6ec45f29bb1bc94e7299Nicolas Catania    print "Gnuplot should be 1.8. See REAME file"
333d989a8e37771a2f97b1c6ec45f29bb1bc94e7299Nicolas Catania    sys.exit(2)
334d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania  main(sys.argv)
335