1*09a53ad8SAndrew Turner#!/usr/bin/env python
2*09a53ad8SAndrew Turner
3*09a53ad8SAndrew Turner"""Plot the performance of different variants of the string routines
4*09a53ad8SAndrew Turnerfor one size.
5*09a53ad8SAndrew Turner"""
6*09a53ad8SAndrew Turner
7*09a53ad8SAndrew Turnerimport libplot
8*09a53ad8SAndrew Turner
9*09a53ad8SAndrew Turnerimport pylab
10*09a53ad8SAndrew Turner
11*09a53ad8SAndrew Turner
12*09a53ad8SAndrew Turnerdef plot(records, bytes):
13*09a53ad8SAndrew Turner    records = [x for x in records if x.bytes==bytes]
14*09a53ad8SAndrew Turner
15*09a53ad8SAndrew Turner    variants = libplot.unique(records, 'variant', prefer='this')
16*09a53ad8SAndrew Turner    functions = libplot.unique(records, 'function')
17*09a53ad8SAndrew Turner
18*09a53ad8SAndrew Turner    X = pylab.arange(len(functions))
19*09a53ad8SAndrew Turner    width = 1.0/(len(variants)+1)
20*09a53ad8SAndrew Turner
21*09a53ad8SAndrew Turner    colours = libplot.make_colours()
22*09a53ad8SAndrew Turner
23*09a53ad8SAndrew Turner    pylab.figure(1).set_size_inches((16, 12))
24*09a53ad8SAndrew Turner    pylab.clf()
25*09a53ad8SAndrew Turner
26*09a53ad8SAndrew Turner    for i, variant in enumerate(variants):
27*09a53ad8SAndrew Turner        heights = []
28*09a53ad8SAndrew Turner
29*09a53ad8SAndrew Turner        for function in functions:
30*09a53ad8SAndrew Turner            matches = [x for x in records if x.variant==variant and x.function==function and x.src_alignment==8]
31*09a53ad8SAndrew Turner
32*09a53ad8SAndrew Turner            if matches:
33*09a53ad8SAndrew Turner                vals = [match.bytes*match.loops/match.elapsed/(1024*1024) for
34*09a53ad8SAndrew Turner                        match in matches]
35*09a53ad8SAndrew Turner                mean = sum(vals)/len(vals)
36*09a53ad8SAndrew Turner                heights.append(mean)
37*09a53ad8SAndrew Turner            else:
38*09a53ad8SAndrew Turner                heights.append(0)
39*09a53ad8SAndrew Turner
40*09a53ad8SAndrew Turner        pylab.bar(X+i*width, heights, width, color=colours.next(), label=variant)
41*09a53ad8SAndrew Turner
42*09a53ad8SAndrew Turner    axes = pylab.axes()
43*09a53ad8SAndrew Turner    axes.set_xticklabels(functions)
44*09a53ad8SAndrew Turner    axes.set_xticks(X + 0.5)
45*09a53ad8SAndrew Turner
46*09a53ad8SAndrew Turner    pylab.title('Performance of different variants for %d byte blocks' % bytes)
47*09a53ad8SAndrew Turner    pylab.ylabel('Rate (MB/s)')
48*09a53ad8SAndrew Turner    pylab.legend(loc='upper left', ncol=3)
49*09a53ad8SAndrew Turner    pylab.grid()
50*09a53ad8SAndrew Turner    pylab.savefig('top-%06d.png' % bytes, dpi=72)
51*09a53ad8SAndrew Turner
52*09a53ad8SAndrew Turnerdef main():
53*09a53ad8SAndrew Turner    records = libplot.parse()
54*09a53ad8SAndrew Turner
55*09a53ad8SAndrew Turner    for bytes in libplot.unique(records, 'bytes'):
56*09a53ad8SAndrew Turner        plot(records, bytes)
57*09a53ad8SAndrew Turner
58*09a53ad8SAndrew Turner    pylab.show()
59*09a53ad8SAndrew Turner
60*09a53ad8SAndrew Turnerif __name__ == '__main__':
61*09a53ad8SAndrew Turner    main()
62