summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Peter <mail@david-peter.de>2021-11-22 21:06:48 +0100
committerDavid Peter <sharkdp@users.noreply.github.com>2021-11-23 08:14:49 +0100
commitb12503a46aa1f4d013575ca7a4230d74eec708cc (patch)
tree1f9d69c8e0df07272de3837cd2a43b248f8a1f54
parentea2faf45e4fc772d54d420bd886bc8d046a48acf (diff)
Markdown (and JSON) reports
-rw-r--r--tests/benchmarks/.gitignore1
-rwxr-xr-xtests/benchmarks/run-benchmarks.sh62
2 files changed, 44 insertions, 19 deletions
diff --git a/tests/benchmarks/.gitignore b/tests/benchmarks/.gitignore
new file mode 100644
index 00000000..98838743
--- /dev/null
+++ b/tests/benchmarks/.gitignore
@@ -0,0 +1 @@
+/benchmark-results
diff --git a/tests/benchmarks/run-benchmarks.sh b/tests/benchmarks/run-benchmarks.sh
index 690a78aa..d294e793 100755
--- a/tests/benchmarks/run-benchmarks.sh
+++ b/tests/benchmarks/run-benchmarks.sh
@@ -1,4 +1,5 @@
#!/usr/bin/env bash
+
cd "$(dirname "${BASH_SOURCE[0]}")" || exit
# Check that Hyperfine is installed.
@@ -19,16 +20,28 @@ get_cargo_target_dir() {
cargo metadata --no-deps --format-version 1 | jq -r .target_directory
}
+heading() {
+ bold=$(tput bold)$(tput setaf 220)
+ normal=$(tput sgr0)
+ echo
+ printf "\n%s%s%s\n\n" "$bold" "$1" "$normal"
+
+ echo -e "\n### $1\n" >> "$REPORT"
+}
+
+RESULT_DIR="benchmark-results"
+REPORT="$RESULT_DIR/report.md"
+
TARGET_DIR="$(get_cargo_target_dir)"
-TARGET_DEBUG="${TARGET_DIR}/debug/bat"
TARGET_RELEASE="${TARGET_DIR}/release/bat"
+WARMUP_COUNT=3
+
# Determine which target to benchmark.
BAT=''
for arg in "$@"; do
case "$arg" in
--system) BAT="bat" ;;
- --debug) BAT="$TARGET_DEBUG" ;;
--release) BAT="$TARGET_RELEASE" ;;
--bat=*) BAT="${arg:6}" ;;
esac
@@ -36,37 +49,48 @@ done
if [[ -z "$BAT" ]]; then
echo "A build of 'bat' must be specified for benchmarking."
- echo "You can use '--system', '--debug', or '--release'."
+ echo "You can use '--system', '--release' or '--bat=path/to/bat'."
exit 1
fi
-# Ensure that the target is built.
if ! command -v "$BAT" &>/dev/null; then
- echo "Could not find the build of bat to benchmark."
+ echo "Could not find the build of bat to benchmark ($BAT)."
case "$BAT" in
"bat") echo "Make you sure to symlink 'batcat' as 'bat'." ;;
- "$TARGET_DEBUG") echo "Make you sure to 'cargo build' first." ;;
"$TARGET_RELEASE") echo "Make you sure to 'cargo build --release' first." ;;
esac
exit 1
fi
-# Run the benchmark.
-echo "### Startup time"
-echo
+# Run the benchmarks
+mkdir -p "$RESULT_DIR"
+rm -f "$RESULT_DIR"/*.md
-hyperfine --warmup 3 "$BAT"
+echo "## \`bat\` benchmark results" >> "$REPORT"
-echo
-echo "### Plain text"
-echo
+heading "Startup time"
+hyperfine \
+ "$BAT" \
+ --warmup "$WARMUP_COUNT" \
+ --export-markdown "$RESULT_DIR/startup-time.md" \
+ --export-json "$RESULT_DIR/startup-time.json"
+cat "$RESULT_DIR/startup-time.md" >> "$REPORT"
-hyperfine --warmup 3 "$(printf "%q" "$BAT") --language txt --paging=never 'test-src/jquery-3.3.1.js'"
-
-echo
-echo "### Time to syntax-highlight large files"
-echo
+heading "Plain text speed"
+hyperfine \
+ "$(printf "%q" "$BAT") --language txt --paging=never 'test-src/jquery-3.3.1.js'" \
+ --warmup "$WARMUP_COUNT" \
+ --export-markdown "$RESULT_DIR/plain-text-speed.md" \
+ --export-json "$RESULT_DIR/plain-text-speed.json"
+cat "$RESULT_DIR/plain-text-speed.md" >> "$REPORT"
for SRC in test-src/*; do
- hyperfine --warmup 3 "$(printf "%q" "$BAT") --style=full --color=always --paging=never $(printf "%q" "$SRC")"
+ filename="$(basename "$SRC")"
+ heading "Syntax highlighting speed: \`$filename\`"
+
+ hyperfine --warmup "$WARMUP_COUNT" \
+ "$(printf "%q" "$BAT") --style=full --color=always --paging=never $(printf "%q" "$SRC")" \
+ --export-markdown "$RESULT_DIR/syntax-highlighting-speed-${filename}.md" \
+ --export-json "$RESULT_DIR/syntax-highlighting-speed-${filename}.json"
+ cat "$RESULT_DIR/syntax-highlighting-speed-${filename}.md" >> "$REPORT"
done