diff options
author | David Robillard <d@drobilla.net> | 2020-12-31 16:16:05 +0100 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2020-12-31 18:13:35 +0100 |
commit | c28206d88b581fe22ac953b998b05471f62f30f4 (patch) | |
tree | d6aded38e661cfa5b8849b59516b7fab1baf4225 /scripts | |
parent | ad42412e3353893ccb365cf357a286b0afe545ba (diff) | |
download | zix-c28206d88b581fe22ac953b998b05471f62f30f4.tar.gz zix-c28206d88b581fe22ac953b998b05471f62f30f4.tar.bz2 zix-c28206d88b581fe22ac953b998b05471f62f30f4.zip |
Move benchmarking to a separate script
Diffstat (limited to 'scripts')
-rwxr-xr-x | scripts/benchmark.py | 60 | ||||
-rwxr-xr-x | scripts/plot.py | 94 |
2 files changed, 154 insertions, 0 deletions
diff --git a/scripts/benchmark.py b/scripts/benchmark.py new file mode 100755 index 0000000..9b57a45 --- /dev/null +++ b/scripts/benchmark.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python + +""" +Benchmark Zix data structures. +""" + +import os +import random +import string +import subprocess + +os.chdir("build") + +# Benchmark trees + +subprocess.call(["benchmark/tree_bench", "40000", "640000"]) +subprocess.call( + [ + "../scripts/plot.py", + "tree_bench.svg", + "tree_insert.txt", + "tree_search.txt", + "tree_iterate.txt", + "tree_delete.txt", + ] +) + +# Benchmark dictionaries + +FILENAME = "gibberish.txt" +CHARACTERS = string.ascii_letters + string.digits + + +def random_word(): + """Return a random word with ASCII letters and digits""" + + wordlen = random.randrange(1, 64) + word = "" + for _ in range(wordlen): + word += random.choice(CHARACTERS) + + return word + + +if not os.path.exists(FILENAME): + print("Generating random text %s" % FILENAME) + + with open(FILENAME, "w") as out: + for i in range(1 << 20): + out.write(random_word() + "\n") + +subprocess.call(["benchmark/dict_bench", "gibberish.txt"]) +subprocess.call( + [ + "../scripts/plot.py", + "dict_bench.svg", + "dict_insert.txt", + "dict_search.txt", + ] +) diff --git a/scripts/plot.py b/scripts/plot.py new file mode 100755 index 0000000..29fffa9 --- /dev/null +++ b/scripts/plot.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python + +import math +import os +import sys + +import matplotlib +from matplotlib import pyplot +from matplotlib.pyplot import * + +matplotlib.rc('text', **{ + 'usetex': True}) +matplotlib.rc('font', **{ + 'family': 'serif', + 'serif': 'Times', + 'sans-serif': 'Helvetica', + 'monospace': 'Courier'}) + +pyplot.subplots_adjust(wspace=0.2, hspace=0.2) + +class SensibleScalarFormatter(matplotlib.ticker.ScalarFormatter): + "ScalarFormatter which rounds order of magnitude to a multiple of 3" + def __init__(self): + matplotlib.ticker.ScalarFormatter.__init__(self) + self.set_powerlimits([-6, 6]) + self.set_scientific(True) + + def _set_orderOfMagnitude(self, range): + # Calculate "best" order in the usual way + matplotlib.ticker.ScalarFormatter._set_orderOfMagnitude(self, range) + + # Round down to sensible (millions, billions, etc) order + self.orderOfMagnitude = self.orderOfMagnitude - (self.orderOfMagnitude % 3) + + self.set_scientific(True) + +file_prefix = os.path.commonprefix(sys.argv[1:]) +n_plots = len(sys.argv) - 2 +for i in range(n_plots): + filename = sys.argv[i+2] + file = open(filename, 'r') + + # pyplot.clf() + + ax = pyplot.subplot(math.ceil(math.sqrt(n_plots)), + math.ceil(math.sqrt(n_plots)), + i + 1) + + ax.xaxis.set_major_formatter(SensibleScalarFormatter()) + ax.yaxis.set_major_formatter(SensibleScalarFormatter()) + for a in ['x', 'y']: + ax.grid(which='major', axis=a, zorder=1, + linewidth=0.5, linestyle=':', color='0', dashes=[0.5, 8.0]) + + header = file.readline() + columns = header[1:].split() + + pyplot.xlabel('Elements') + pyplot.ylabel('Time (s)') + + times = [] + for i in columns: + times.append([]) + for line in file: + if line[0] == '#': + continue; + + fields = line.split() + num = 0 + for i in fields: + times[num].append([float(i)]) + num += 1 + + file.close() + + for i in range(len(times) - 1): + matplotlib.pyplot.plot(times[0], times[i + 1], '-o', label=columns[i + 1]) + + pyplot.legend(loc='upper left', + handletextpad=0.15, borderpad=0.20, borderaxespad=0, + labelspacing=0.10, columnspacing=0, + framealpha=0.90) + + pyplot.title(os.path.splitext(filename[len(file_prefix):])[0].title()) + + # out = filename.replace('.dat', '.png') + # print('Writing %s' % out) + # matplotlib.pyplot.savefig(out, bbox_inches='tight', pad_inches=0.025) + +print('Writing %s' % sys.argv[1]) +matplotlib.pyplot.tight_layout() +matplotlib.pyplot.savefig(sys.argv[1]) + +#matplotlib.pyplot.show() |