mirror of
https://github.com/sharkdp/bat
synced 2024-12-22 18:23:08 +00:00
747b15436a
Using Markdown for a startup test is useful since it has so many dependencies on other syntaxes. So such a test makes sure that lazy-loading of syntaxes work. It is however also useful to measure the startup time of bat when the time to load a syntax is very small, and the measured startup time has mostly non-syntax related causes. Such as: * Parsing arguments * Setting up syntax mapping * Loading themes This commit adds such a test. It uses the CpuInfo syntax which is very small. Only 14 lines, compared to the 1581 lines that Markdown is (not including the size of its included syntaxes). This command can be used to get an approximation of the size of syntaxes, and thus how expensive they are to load: find -name *.sublime-syntax -print0 | xargs --null wc -l | sort -n -r
136 lines
3.9 KiB
Bash
Executable file
Vendored
136 lines
3.9 KiB
Bash
Executable file
Vendored
#!/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
|
|
|
|
# Check that jq is installed.
|
|
if ! command -v jq > /dev/null 2>&1; then
|
|
echo "'jq' does not seem to be installed."
|
|
echo "You can get it here: https://stedolan.github.io/jq"
|
|
exit 1
|
|
fi
|
|
|
|
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"
|
|
}
|
|
|
|
# Clean up environment
|
|
unset BAT_CACHE_PATH
|
|
unset BAT_CONFIG_DIR
|
|
unset BAT_CONFIG_PATH
|
|
unset BAT_OPTS
|
|
unset BAT_PAGER
|
|
unset BAT_STYLE
|
|
unset BAT_TABS
|
|
unset BAT_THEME
|
|
unset COLORTERM
|
|
unset NO_COLOR
|
|
unset PAGER
|
|
|
|
|
|
RESULT_DIR="benchmark-results"
|
|
REPORT="$RESULT_DIR/report.md"
|
|
|
|
TARGET_DIR="$(get_cargo_target_dir)"
|
|
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" ;;
|
|
--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', '--release' or '--bat=path/to/bat'."
|
|
exit 1
|
|
fi
|
|
|
|
if ! command -v "$BAT" &>/dev/null; then
|
|
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_RELEASE") echo "Make you sure to 'cargo build --release' first." ;;
|
|
esac
|
|
exit 1
|
|
fi
|
|
|
|
# Run the benchmarks
|
|
mkdir -p "$RESULT_DIR"
|
|
rm -f "$RESULT_DIR"/*.md
|
|
|
|
echo "## \`bat\` benchmark results" >> "$REPORT"
|
|
|
|
|
|
heading "Startup time"
|
|
hyperfine \
|
|
"$(printf "%q" "$BAT") --no-config" \
|
|
--command-name "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"
|
|
|
|
|
|
heading "Startup time with syntax highlighting"
|
|
hyperfine \
|
|
"$(printf "%q" "$BAT") --no-config --color=always test-src/small-CpuInfo-file.cpuinfo" \
|
|
--command-name "bat … small-CpuInfo-file.cpuinfo" \
|
|
--warmup "$WARMUP_COUNT" \
|
|
--export-markdown "$RESULT_DIR/startup-time-with-syntax-highlighting.md" \
|
|
--export-json "$RESULT_DIR/startup-time-with-syntax-highlighting.json"
|
|
cat "$RESULT_DIR/startup-time-with-syntax-highlighting.md" >> "$REPORT"
|
|
|
|
|
|
heading "Startup time with syntax with dependencies"
|
|
hyperfine \
|
|
"$(printf "%q" "$BAT") --no-config --color=always test-src/small-Markdown-file.md" \
|
|
--command-name "bat … small-Markdown-file.md" \
|
|
--warmup "$WARMUP_COUNT" \
|
|
--export-markdown "$RESULT_DIR/startup-time-with-syntax-with-dependencies.md" \
|
|
--export-json "$RESULT_DIR/startup-time-with-syntax-with-dependencies.json"
|
|
cat "$RESULT_DIR/startup-time-with-syntax-with-dependencies.md" >> "$REPORT"
|
|
|
|
|
|
heading "Plain-text speed"
|
|
hyperfine \
|
|
"$(printf "%q" "$BAT") --no-config --language=txt --style=plain test-src/numpy_test_multiarray.py" \
|
|
--command-name 'bat … --language=txt numpy_test_multiarray.py' \
|
|
--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
|
|
filename="$(basename "$SRC")"
|
|
|
|
heading "Syntax highlighting speed: \`$filename\`"
|
|
hyperfine --warmup "$WARMUP_COUNT" \
|
|
"$(printf "%q" "$BAT") --no-config --style=full --color=always --wrap=character --terminal-width=80 '$SRC'" \
|
|
--command-name "bat … ${filename}" \
|
|
--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
|