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