99 lines
2.6 KiB
Bash
Executable File
99 lines
2.6 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
set -e
|
|
|
|
msg() {
|
|
printf '%s\n' "$*";
|
|
}
|
|
|
|
if [ $# -ne 2 ]; then
|
|
msg "Usage: compare_v_to_c_performance COMMIT_BEFORE COMMIT_AFTER"
|
|
exit 1
|
|
fi
|
|
|
|
depend_on() {
|
|
type "$1" >/dev/null 2>&1 || {
|
|
printf 'ERR: missing tool "%s"\n' "$1" >&2; exit 1;
|
|
}
|
|
}
|
|
|
|
depend_on sh
|
|
depend_on cp
|
|
depend_on rm
|
|
depend_on wc
|
|
depend_on head
|
|
depend_on cc
|
|
depend_on strip
|
|
depend_on git
|
|
depend_on upx
|
|
depend_on make
|
|
depend_on hyperfine
|
|
|
|
######################################################################
|
|
## NB: cc should be a working, recent, sane C99 compiler
|
|
## cc is used by the Makefile to bootstrap v (both gcc/clang work)
|
|
##
|
|
## If you are a C/V developer in a unix environment, you most probably
|
|
## already have the above installed, with the possible exception of:
|
|
## https://github.com/sharkdp/hyperfine
|
|
##
|
|
## Installing them is out of scope of this tool.
|
|
######################################################################
|
|
|
|
COMMIT_B="$1"
|
|
COMMIT_A="$2"
|
|
|
|
CWD="$(pwd)"
|
|
WORKDIR="/tmp"
|
|
|
|
B="$WORKDIR/v_at_$COMMIT_B"
|
|
A="$WORKDIR/v_at_$COMMIT_A"
|
|
|
|
prepare_v() {
|
|
msg
|
|
msg "Cloning current v source to $1 ..."
|
|
git clone --quiet "$CWD" "$1"
|
|
|
|
cd "$1"
|
|
git checkout --quiet "$2"
|
|
|
|
msg "Making v and vprod compilers in $1"
|
|
make > /dev/null
|
|
./v -o v compiler
|
|
./v -prod -o vprod compiler
|
|
cp v v_stripped
|
|
cp vprod vprod_stripped
|
|
strip *_stripped
|
|
cp v_stripped v_stripped_upxed
|
|
cp vprod_stripped vprod_stripped_upxed
|
|
upx -qqq --lzma v_stripped_upxed
|
|
upx -qqq --lzma vprod_stripped_upxed
|
|
wc -c "$1/v" "$1/v_stripped" "$1/v_stripped_upxed" "$1/vprod" "$1/vprod_stripped" "$1/vprod_stripped_upxed" | head -n -1
|
|
VVERSION="$($1/v --version)"
|
|
GVERSION="$(git rev-parse --short --verify HEAD)"
|
|
msg "V version is: $VVERSION , local source commit: $GVERSION"
|
|
}
|
|
|
|
compare_v_performance() {
|
|
CMD="$1"
|
|
msg "---------------------------------------------------------------------------------"
|
|
msg "Compare '$CMD'"
|
|
hyperfine --warmup=3 "cd '$B/' && $CMD " "cd '$A/' && $CMD "
|
|
msg
|
|
}
|
|
|
|
##############################################################################
|
|
# Cleanup artifacts from previous runs of this tool:
|
|
cd "$WORKDIR"
|
|
rm -rf "$A/" "$B/"
|
|
##############################################################################
|
|
|
|
msg "Comparing v compiler performance of commit $COMMIT_B (before) vs commit $COMMIT_A (after) ..."
|
|
prepare_v "$B" "$COMMIT_B"
|
|
prepare_v "$A" "$COMMIT_A"
|
|
|
|
cd "$WORKDIR"
|
|
compare_v_performance "./v -o x.c compiler"
|
|
compare_v_performance "./vprod -o x.c compiler"
|
|
compare_v_performance "./vprod -o x compiler"
|