Changes in benchmark/plot.py [76f5e9f:8fca132]
- File:
-
- 1 edited
-
benchmark/plot.py (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
benchmark/plot.py
r76f5e9f r8fca132 14 14 import math 15 15 import numpy 16 import os 16 17 import re 17 18 import statistics 18 19 import sys 19 20 import time 21 22 import matplotlib 20 23 import matplotlib.pyplot as plt 21 from matplotlib.ticker import EngFormatter 24 from matplotlib.ticker import EngFormatter, ScalarFormatter 25 26 def fmtDur( duration ): 27 if duration : 28 hours, rem = divmod(duration, 3600) 29 minutes, rem = divmod(rem, 60) 30 seconds, millis = divmod(rem, 1) 31 return "%2d:%02d.%03d" % (minutes, seconds, millis * 1000) 32 return " n/a" 22 33 23 34 class Field: 24 def __init__(self, unit, _min, _log, _name=None ):35 def __init__(self, unit, _min, _log, _name=None, _factor=1.0): 25 36 self.unit = unit 26 37 self.min = _min 27 38 self.log = _log 28 39 self.name = _name 40 self.factor = _factor 29 41 30 42 field_names = { 31 43 "ns per ops" : Field('ns' , 0, False), 32 "Number of processors" : Field('' , 1, False),44 "Number of processors" : Field('' , 1, "exact"), 33 45 "Ops per procs" : Field('Ops' , 0, False), 34 46 "Ops per threads" : Field('Ops' , 0, False), 35 "ns per ops/procs" : Field('' , 0, False, _name = "Latency (ns $/$ (Processor $\\times$ Operation))" ),47 "ns per ops/procs" : Field('' , 0, False, _name = "ns $\\times$ (Processor $/$ Total Ops)" ), 36 48 "Number of threads" : Field('' , 1, False), 37 49 "Total Operations(ops)" : Field('Ops' , 0, False), 38 50 "Ops/sec/procs" : Field('Ops' , 0, False), 39 51 "Total blocks" : Field('Blocks', 0, False), 40 "Ops per second" : Field('' , 0, False),52 "Ops per second" : Field('' , 0, False), 41 53 "Cycle size (# thrds)" : Field('thrd' , 1, False), 42 54 "Duration (ms)" : Field('ms' , 0, False), 43 55 "Target QPS" : Field('' , 0, False), 44 56 "Actual QPS" : Field('' , 0, False), 45 "Average Read Latency" : Field('us' , 0, True), 46 "Median Read Latency" : Field('us' , 0, True), 47 "Tail Read Latency" : Field('us' , 0, True), 48 "Average Update Latency": Field('us' , 0, True), 49 "Median Update Latency" : Field('us' , 0, True), 50 "Tail Update Latency" : Field('us' , 0, True), 51 "Update Ratio" : Field('\%' , 0, False), 57 "Average Read Latency" : Field('s' , 0, False, _factor = 0.000001), 58 "Median Read Latency" : Field('s' , 0, True, _factor = 0.000001), 59 "Tail Read Latency" : Field('s' , 0, True, _factor = 0.000001), 60 "Average Update Latency": Field('s' , 0, True, _factor = 0.000001), 61 "Median Update Latency" : Field('s' , 0, True, _factor = 0.000001), 62 "Tail Update Latency" : Field('s' , 0, True, _factor = 0.000001), 63 "Update Ratio" : Field('%' , 0, False), 64 "Request Rate" : Field('req/s' , 0, False), 65 "Data Rate" : Field('b/s' , 0, False, _factor = 1000 * 1000, _name = "Response Throughput"), 66 "Errors" : Field('%' , 0, False), 52 67 } 53 68 54 def plot(in_data, x, y, options ):69 def plot(in_data, x, y, options, prefix): 55 70 fig, ax = plt.subplots() 56 colors = itertools.cycle(['#0095e3','#006cb4','#69df00','#0aa000','#fb0300','#e30002','#fd8f00','#ff7f00','#8f00d6','#4b009a','#ffff00','#b13f00']) 57 series = {} # scatter data for each individual data point 58 groups = {} # data points for x value 71 colors = itertools.cycle(['#006cb4','#0aa000','#ff6600','#8510a1','#0095e3','#fd8f00','#e30002','#8f00d6','#4b009a','#ffff00','#69df00','#fb0300','#b13f00']) 72 markers = itertools.cycle(['x', '+', '1', '2', '3', '4']) 73 series = {} # scatter data for each individual data point 74 groups = {} # data points for x value 59 75 60 76 print("Preparing Data") … … 62 78 for entry in in_data: 63 79 name = entry[0] 80 if options.filter and not name.startswith(options.filter): 81 continue 82 64 83 if not name in series: 65 84 series[name] = {'x':[], 'y':[]} … … 70 89 if x in entry[2] and y in entry[2]: 71 90 xval = entry[2][x] 72 yval = entry[2][y] 91 yval = entry[2][y] * field_names[y].factor 73 92 series[name]['x'].append(xval) 74 93 series[name]['y'].append(yval) … … 98 117 for name, data in sorted(series.items()): 99 118 _col = next(colors) 100 plt.scatter(data['x'], data['y'], color=_col, label=name, marker='x') 101 plt.plot(lines[name]['x'], lines[name]['min'], '--', color=_col) 119 _mrk = next(markers) 120 plt.scatter(data['x'], data['y'], color=_col, label=name[len(prefix):], marker=_mrk) 121 plt.plot(lines[name]['x'], lines[name]['min'], ':', color=_col) 102 122 plt.plot(lines[name]['x'], lines[name]['max'], '--', color=_col) 103 123 plt.plot(lines[name]['x'], lines[name]['med'], '-', color=_col) … … 119 139 elif field_names[x].log: 120 140 ax.set_xscale('log') 141 if field_names[x].log == "exact": 142 xvals = set() 143 for s in series.values(): 144 xvals |= set(s['x']) 145 ax.set_xticks(sorted(xvals)) 146 ax.get_xaxis().set_major_formatter(ScalarFormatter()) 147 plt.xticks(rotation = 45) 121 148 else: 122 149 plt.xlim(field_names[x].min, mx + 0.25) 123 150 124 ax.yaxis.set_major_formatter( EngFormatter(unit=field_names[y].unit) )125 151 if options.logy: 126 152 ax.set_yscale('log') … … 130 156 plt.ylim(field_names[y].min, options.MaxY if options.MaxY else my*1.2) 131 157 158 ax.yaxis.set_major_formatter( EngFormatter(unit=field_names[y].unit) ) 159 132 160 plt.legend(loc='upper left') 133 161 134 162 print("Results Ready") 163 start = time.time() 135 164 if options.out: 136 165 plt.savefig(options.out, bbox_inches='tight') 137 166 else: 138 167 plt.show() 168 end = time.time() 169 print("Took {}".format(fmtDur(end - start))) 139 170 140 171 … … 150 181 parser.add_argument('--logy', action='store_true', help="if set, makes the y-axis logscale") 151 182 parser.add_argument('--MaxY', nargs='?', type=int, help="maximum value of the y-axis") 183 parser.add_argument('--filter', nargs='?', type=str, default="", help="if not empty, only print series that start with specified filter") 152 184 153 185 options = parser.parse_args() 186 187 # if not options.out: 188 # matplotlib.use('SVG') 154 189 155 190 # ================================================================================ … … 173 208 fields.add(label) 174 209 210 # filter out the series if needed 211 if options.filter: 212 series = set(filter(lambda elem: elem.startswith(options.filter), series)) 213 214 # find the common prefix on series for removal (only if no filter) 215 prefix = os.path.commonprefix(list(series)) 216 175 217 if not options.out : 176 218 print(series) … … 193 235 194 236 195 plot(data, wantx, wanty, options )237 plot(data, wantx, wanty, options, prefix)
Note:
See TracChangeset
for help on using the changeset viewer.