From 3f364f9d4cf434dbc8279a9783610e147e565ed6 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Mon, 5 Aug 2024 07:14:57 +0200 Subject: [PATCH] Grouped bar chart graph --- README.md | 2 +- benchmark-time.png | Bin 42013 -> 0 bytes benchmark-time.svg | 1399 ++++++++++++++++++++++++++++++++ scripts/benchmark-addr2line.sh | 5 +- scripts/benchmark-plot.py | 31 +- 5 files changed, 1424 insertions(+), 13 deletions(-) delete mode 100644 benchmark-time.png create mode 100644 benchmark-time.svg diff --git a/README.md b/README.md index 666e059..74cf333 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ as `addr2line` from binutils, `eu-addr2line` from elfutils, and `llvm-addr2line` from the llvm project. Current benchmarks show a performance improvement in all cases: -![addr2line runtime](benchmark-time.png) +![addr2line runtime](benchmark-time.svg) ## License diff --git a/benchmark-time.png b/benchmark-time.png deleted file mode 100644 index 721322852ec540d5807d953c7c09f5c5941cae51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42013 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 + + + + + + + 2024-08-05T11:47:44.658296 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/benchmark-addr2line.sh b/scripts/benchmark-addr2line.sh index 39a1d23..8d9ad41 100755 --- a/scripts/benchmark-addr2line.sh +++ b/scripts/benchmark-addr2line.sh @@ -9,7 +9,8 @@ mkdir -p $WORKDIR benchmark() { $ADDR2LINE_BINARY --all -a -e $1 | grep 0x | shuf --random-source=<(yes 123456789) | head -n $2 > $SYMBOLS_PATH BINARY_NAME=`basename -s .debug $1` - echo "=== Running benchmark for $BINARY_NAME (`du -hs $1 | cut -f1`, $2 symbol queries) ===" + BINARY_SIZE=`du -hs $1 | cut -f1` + echo "=== Running benchmark for $BINARY_NAME ===" hyperfine \ --style=color \ @@ -22,6 +23,8 @@ benchmark() { --export-json="$WORKDIR/benchmark-$BINARY_NAME.json" \ -L input $BINARY_NAME \ -L tool $ADDR2LINE_BINARY,/usr/bin/llvm-addr2line,/usr/bin/addr2line,/usr/bin/eu-addr2line \ + -L size $BINARY_SIZE \ + -L symbol_queries $2 \ "{tool} -af -e $1 < $SYMBOLS_PATH" } diff --git a/scripts/benchmark-plot.py b/scripts/benchmark-plot.py index 12d0685..18dbbd0 100755 --- a/scripts/benchmark-plot.py +++ b/scripts/benchmark-plot.py @@ -1,15 +1,13 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import argparse import glob import json import matplotlib.pyplot as plt -import sys +import numpy as np parser = argparse.ArgumentParser() -parser.add_argument( - "-o", "--output", help="Save image to the given filename." -) +parser.add_argument("-o", "--output", help="Save image to the given filename.") args = parser.parse_args() @@ -17,21 +15,32 @@ data = [] inputs = [] -for filename in glob.glob("scripts/tmp/benchmark-*.json"): +for filename in sorted(glob.glob("scripts/tmp/benchmark-*.json")): with open(filename) as f: results = json.load(f)["results"] commands = [b["command"] for b in results] data.append([b["mean"] for b in results]) - inputs.append(results[0]["parameters"]["input"]) -data = map(list, zip(*data)) -for (times, command) in zip(data, commands): - plt.plot(inputs, times, label=command) + input = results[0]["parameters"]["input"] + binary_size = results[0]["parameters"]["size"] + symbol_queries = results[0]["parameters"]["symbol_queries"] + inputs.append(f"{input}\n({binary_size}, {symbol_queries} qrs)") + +data = np.transpose(data) + +x = np.arange(len(inputs)) # the label locations +width = 0.2 # the width of the bars + +fig, ax = plt.subplots(layout="constrained") +for i, command in enumerate(commands): + offset = width * (i + 1) + rects = ax.bar(x + offset, data[i], width, label=command) + +ax.set_xticks(x + 0.5, inputs) plt.title("addr2line runtime") plt.xlabel("Input") plt.ylabel("Time [s]") -plt.ylim(0, None) plt.legend(title="Tool") if args.output: