summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/histogram/benchmark/plot_benchmarks.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/histogram/benchmark/plot_benchmarks.py')
-rwxr-xr-xsrc/boost/libs/histogram/benchmark/plot_benchmarks.py112
1 files changed, 112 insertions, 0 deletions
diff --git a/src/boost/libs/histogram/benchmark/plot_benchmarks.py b/src/boost/libs/histogram/benchmark/plot_benchmarks.py
new file mode 100755
index 000000000..2661549fd
--- /dev/null
+++ b/src/boost/libs/histogram/benchmark/plot_benchmarks.py
@@ -0,0 +1,112 @@
+#!/usr/bin/env python3
+
+# Copyright Hans Dembinski 2019
+# Distributed under the Boost Software License, Version 1.0.
+# See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt
+
+from matplotlib import pyplot as plt, lines
+import shelve
+import json
+import subprocess as subp
+import sys
+from collections import defaultdict
+from run_benchmarks import get_commits, run
+import numpy as np
+import threading
+
+thread = None
+current_index = 0
+
+commits, comments = get_commits()
+
+def get_benchmarks(results):
+ benchmarks = defaultdict(lambda: [])
+ for hash in commits:
+ if hash in results and results[hash] is not None:
+ benchs = results[hash]
+ for b in benchs["benchmarks"]:
+ name = b["name"]
+ time = min(b["cpu_time"], b["real_time"])
+ benchmarks[name].append((commits.index(hash), time))
+ return benchmarks
+
+with shelve.open("benchmark_results") as results:
+ benchmarks = get_benchmarks(results)
+
+fig, ax = plt.subplots(4, 1, figsize=(10, 10), sharex=True)
+plt.subplots_adjust(hspace=0, top=0.98, bottom=0.05, right=0.96)
+
+plt.sca(ax[0])
+for name, xy in benchmarks.items():
+ if "uniform" in name: continue
+ if "_1d" in name:
+ x, y = np.transpose(xy)
+ plt.plot(x, y, ".-", label=name)
+plt.legend(fontsize="xx-small")
+
+plt.sca(ax[1])
+for name, xy in benchmarks.items():
+ if "uniform" in name: continue
+ if "_2d" in name:
+ x, y = np.transpose(xy)
+ plt.plot(x, y, ".-", label=name)
+plt.legend(fontsize="xx-small")
+
+plt.sca(ax[2])
+for name, xy in benchmarks.items():
+ if "uniform" in name: continue
+ if "_3d" in name:
+ x, y = np.transpose(xy)
+ plt.plot(x, y, ".-", label=name)
+plt.legend(fontsize="xx-small")
+
+plt.sca(ax[3])
+for name, xy in benchmarks.items():
+ if "uniform" in name: continue
+ if "_6d" in name:
+ x, y = np.transpose(xy)
+ plt.plot(x, y, ".-", label=name)
+plt.legend(fontsize="xx-small")
+
+plt.figtext(0.01, 0.5, "time per loop / ns [smaller is better]", rotation=90, va="center")
+
+def format_coord(x, y):
+ global current_index
+ current_index = max(0, min(int(x + 0.5), len(commits) - 1))
+ hash = commits[current_index]
+ comment = comments[hash]
+ return f"{hash} {comment}"
+
+for axi in ax.flatten():
+ axi.format_coord = format_coord
+
+def on_key_press(event):
+ global thread
+ if thread and thread.is_alive(): return
+
+ if event.key != "u": return
+
+ hash = commits[current_index]
+
+ def worker(fig, ax, hash):
+ with shelve.open("benchmark_results") as results:
+ run(results, comments, hash, True)
+ benchmarks = get_benchmarks(results)
+
+ for name in benchmarks:
+ xy = benchmarks[name]
+ x, y = np.transpose(xy)
+ for axi in ax.flatten():
+ for artist in axi.get_children():
+ if isinstance(artist, lines.Line2D) and artist.get_label() == name:
+ artist.set_xdata(x)
+ artist.set_ydata(y)
+
+ fig.canvas.draw()
+
+ thread = threading.Thread(target=worker, args=(fig, ax, hash))
+ thread.start()
+
+fig.canvas.mpl_connect('key_press_event', on_key_press)
+
+plt.show()