Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • benchmark/plot.py

    re9c5db2 red49dbd  
    2222
    2323class Field:
    24         def __init__(self, unit, _min, _log):
     24        def __init__(self, unit, _min):
    2525                self.unit = unit
    2626                self.min  = _min
    27                 self.log  = _log
    2827
    2928field_names = {
    30         "ns per ops"            : Field('ns'    , 0, False),
    31         "Number of processors"  : Field(''      , 1, False),
    32         "Ops per procs"         : Field('Ops'   , 0, False),
    33         "Ops per threads"       : Field('Ops'   , 0, False),
    34         "ns per ops/procs"      : Field('ns'    , 0, False),
    35         "Number of threads"     : Field('thrd'  , 1, False),
    36         "Total Operations(ops)" : Field('Ops'   , 0, False),
    37         "Ops/sec/procs"         : Field('Ops'   , 0, False),
    38         "Total blocks"          : Field('Blocks', 0, False),
    39         "Ops per second"        : Field('Ops'   , 0, False),
    40         "Cycle size (# thrds)"  : Field('thrd'  , 1, False),
    41         "Duration (ms)"         : Field('ms'    , 0, False),
    42         "Target QPS"            : Field('QPS'   , 0, False),
    43         "Actual QPS"            : Field('QPS'   , 0, False),
    44         "Median Read Latency"   : Field('us'    , 0, True),
    45         "Tail Read Latency"     : Field('us'    , 0, True),
    46         "Median Update Latency" : Field('us'    , 0, True),
    47         "Tail Update Latency"   : Field('us'    , 0, True),
     29        "ns per ops"           : Field('ns'    , 0),
     30        "Number of processors" : Field(''      , 1),
     31        "Ops per procs"        : Field('Ops'   , 0),
     32        "Ops per threads"      : Field('Ops'   , 0),
     33        "ns per ops/procs"     : Field('ns'    , 0),
     34        "Number of threads"    : Field('thrd'  , 1),
     35        "Total Operations(ops)": Field('Ops'   , 0),
     36        "Ops/sec/procs"        : Field('Ops'   , 0),
     37        "Total blocks"         : Field('Blocks', 0),
     38        "Ops per second"       : Field('Ops'   , 0),
     39        "Cycle size (# thrds)" : Field('thrd'  , 1),
     40        "Duration (ms)"        : Field('ms'    , 0),
    4841}
    4942
     
    5346        series = {} # scatter data for each individual data point
    5447        groups = {} # data points for x value
    55 
    56         print("Preparing Data")
    57 
    5848        for entry in in_data:
    5949                name = entry[0]
     
    7565                        groups[name][xval].append(yval)
    7666
    77         print("Preparing Lines")
    78 
    7967        lines = {} # lines from groups with min, max, median, etc.
    8068        for name, data in groups.items():
     
    9078                        lines[name]['avg'].append(statistics.mean(ys))
    9179
    92         print("Making Plots")
    93 
    9480        for name, data in series.items():
    9581                _col = next(colors)
     
    9985                plt.plot(lines[name]['x'], lines[name]['med'], '-', color=_col)
    10086
    101         print("Calculating Extremums")
    102 
    10387        mx = max([max(s['x']) for s in series.values()])
    10488        my = max([max(s['y']) for s in series.values()])
    10589
    106         print("Finishing Plots")
    107 
    10890        plt.ylabel(y)
    109         # plt.xticks(range(1, math.ceil(mx) + 1))
     91        plt.xlim(field_names[x].min, mx + 0.25)
     92        plt.xticks(range(1, math.ceil(mx) + 1))
    11093        plt.xlabel(x)
     94        plt.ylim(field_names[y].min, my*1.2)
    11195        plt.grid(b = True)
    11296        ax.xaxis.set_major_formatter( EngFormatter(unit=field_names[x].unit) )
    113         if field_names[x].log:
    114                 ax.set_xscale('log')
    115         else:
    116                 plt.xlim(field_names[x].min, mx + 0.25)
    117 
    11897        ax.yaxis.set_major_formatter( EngFormatter(unit=field_names[y].unit) )
    119         if field_names[y].log:
    120                 ax.set_yscale('log')
    121         else:
    122                 plt.ylim(field_names[y].min, my*1.2)
    123 
    12498        plt.legend(loc='upper left')
    125 
    126         print("Results Ready")
    12799        if out:
    128100                plt.savefig(out)
     
    134106        # ================================================================================
    135107        # parse command line arguments
    136         parser = argparse.ArgumentParser(description='Python Script to draw R.M.I.T. results')
    137         parser.add_argument('-f', '--file', nargs='?', type=argparse.FileType('r'), default=sys.stdin, help="Input file")
    138         parser.add_argument('-o', '--out', nargs='?', type=str, default=None, help="Output file")
    139         parser.add_argument('-y', nargs='?', type=str, default="", help="Which field to use as the Y axis")
    140         parser.add_argument('-x', nargs='?', type=str, default="", help="Which field to use as the X axis")
     108        parser = parser = argparse.ArgumentParser(description='Python Script to draw R.M.I.T. results')
     109        parser.add_argument('-f', '--file', nargs='?', type=argparse.FileType('r'), default=sys.stdin)
     110        parser.add_argument('-o', '--out', nargs='?', type=str, default=None)
     111        parser.add_argument('-y', nargs='?', type=str, default="")
    141112
    142         options =  parser.parse_args()
     113        try:
     114                options =  parser.parse_args()
     115        except:
     116                print('ERROR: invalid arguments', file=sys.stderr)
     117                parser.print_help(sys.stderr)
     118                sys.exit(1)
    143119
    144120        # ================================================================================
     
    164140        if not options.out :
    165141                print(series)
    166                 print("fields: ", ' '.join(fields))
     142                print("fields")
     143                for f in fields:
     144                        print("{}".format(f))
    167145
    168         wantx = "Number of processors"
    169         wanty = "ns per ops"
    170 
    171         if options.x:
    172                 if options.x in field_names.keys():
    173                         wantx = options.x
    174                 else:
    175                         print("Could not find X key '{}', defaulting to '{}'".format(options.x, wantx))
    176 
    177         if options.y:
    178                 if options.y in field_names.keys():
    179                         wanty = options.y
    180                 else:
    181                         print("Could not find Y key '{}', defaulting to '{}'".format(options.y, wanty))
    182 
    183 
    184         plot(data, wantx, wanty, options.out)
     146        if options.y and options.y in field_names.keys():
     147                plot(data, "Number of processors", options.y, options.out)
     148        else:
     149                if options.y:
     150                        print("Could not find key '{}', defaulting to 'ns per ops'".format(options.y))
     151                plot(data, "Number of processors", "ns per ops", options.out)
Note: See TracChangeset for help on using the changeset viewer.