diff --git a/tests/benchmarks/run-benchmarks.sh b/tests/benchmarks/run-benchmarks.sh index f74bdf24..86f4bf68 100755 --- a/tests/benchmarks/run-benchmarks.sh +++ b/tests/benchmarks/run-benchmarks.sh @@ -1,28 +1,72 @@ #!/usr/bin/env bash - cd "$(dirname "${BASH_SOURCE[0]}")" || exit +# Check that Hyperfine is installed. if ! command -v hyperfine > /dev/null 2>&1; then echo "'hyperfine' does not seem to be installed." echo "You can get it here: https://github.com/sharkdp/hyperfine" exit 1 fi +# Determine the target directories. +get_target_dir() { + if [[ -f "$HOME/.cargo/config" ]]; then + grep 'target-dir[[:space:]]*=' "$HOME/.cargo/config" \ + | sed 's/^[[:space:]]*target-dir[[:space:]]*=//; s/^[[:space:]]*"//; s/"[[:space:]]*$//' \ + && return 0 + fi + + echo "../../target" +} + +TARGET_DIR="$(get_target_dir)" +TARGET_DEBUG="${TARGET_DIR}/debug/bat" +TARGET_RELEASE="${TARGET_DIR}/release/bat" + +# 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 +done + +if [[ -z "$BAT" ]]; then + echo "A build of 'bat' must be specified for benchmarking." + echo "You can use '--system', '--debug', or '--release'." + 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." + 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 -hyperfine --warmup 3 bat +hyperfine --warmup 3 "$BAT" echo echo "### Plain text" echo -hyperfine --warmup 3 "bat --language txt --paging=never 'test-src/jquery-3.3.1.js'" +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 for SRC in test-src/*; do - hyperfine --warmup 3 "bat --style=full --color=always --paging=never '$SRC'" + hyperfine --warmup 3 "$(printf "%q" "$BAT") --style=full --color=always --paging=never $(printf "%q" "$SRC")" done