2008-10-16 11:56:19 +01:00
|
|
|
#!/bin/sh
|
|
|
|
|
set -e
|
|
|
|
|
|
|
|
|
|
###
|
|
|
|
|
### XXX Source common functions from cairo-perf-diff
|
|
|
|
|
###
|
|
|
|
|
|
|
|
|
|
usage() {
|
|
|
|
|
argv0=`basename $0`
|
|
|
|
|
|
|
|
|
|
cat >&2 << END
|
|
|
|
|
Usage:
|
|
|
|
|
As opposed to its sibling, cairo-perf-diff, cairo-perf-graph targets
|
|
|
|
|
reviewing changes between series by graphically comparing the performance
|
|
|
|
|
at each commit.
|
|
|
|
|
|
|
|
|
|
The two revisions can be any revision accepted by git. For example:
|
|
|
|
|
|
|
|
|
|
$argv0 1.2.0 1.2.4 # Compare performance of 1.2.0 to 1.2.4
|
|
|
|
|
|
|
|
|
|
Options:
|
|
|
|
|
|
|
|
|
|
-f, --force
|
|
|
|
|
Forces cairo-perf-diff to re-run performance tests
|
|
|
|
|
even if cached performance data is available.
|
|
|
|
|
|
|
|
|
|
-h, --html
|
|
|
|
|
With this option performance changes are summarized
|
|
|
|
|
as HTML table.
|
|
|
|
|
|
|
|
|
|
Additional options can be passed the child cairo-perf process
|
|
|
|
|
by separating them with a double hyphen (--). For example, to
|
|
|
|
|
examine what the impact of the latest change is on the stroke
|
|
|
|
|
test you might use:
|
|
|
|
|
|
|
|
|
|
$argv0 HEAD -- stroke
|
|
|
|
|
|
|
|
|
|
The performance results are cached in .perf next to the .git directory.
|
|
|
|
|
|
|
|
|
|
Set CAIRO_AUTOGEN_OPTIONS to pass options to autogen for both
|
|
|
|
|
builds.
|
|
|
|
|
END
|
|
|
|
|
|
|
|
|
|
exit 1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# First, pull off any known options
|
|
|
|
|
while true; do
|
|
|
|
|
case $1 in
|
|
|
|
|
-f|--force) force_cairo_perf="true";;
|
|
|
|
|
-h|--html) html_output="true";;
|
2009-06-20 13:09:46 +01:00
|
|
|
-s|--show) show_only="true";;
|
2008-10-16 11:56:19 +01:00
|
|
|
*) break;;
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
shift
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
# Then if anything is left that still looks like an option, (begins
|
|
|
|
|
# with a dash), give usage to catch --help or any other -garbage
|
|
|
|
|
if [ $# -eq 0 ] || [ "`echo "$1" | sed 's/^-//'`" != "$1" ]; then
|
|
|
|
|
usage
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# Finally, pick up the actual revision arguments
|
|
|
|
|
old="$1"
|
|
|
|
|
new="$2"
|
|
|
|
|
shift 2
|
|
|
|
|
|
|
|
|
|
# And post-finally, pass anything after -- on to cairo-perf
|
|
|
|
|
CAIRO_PERF_OPTIONS="-r -i 25"
|
|
|
|
|
if [ $# -gt 0 ]; then
|
|
|
|
|
if [ "$1" = "--" ]; then
|
|
|
|
|
shift 1
|
|
|
|
|
CAIRO_PERF_OPTIONS="$CAIRO_PERF_OPTIONS $@"
|
|
|
|
|
else
|
|
|
|
|
usage
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
git_setup() {
|
|
|
|
|
SUBDIRECTORY_OK='Yes'
|
2008-12-14 14:53:27 +00:00
|
|
|
. "$(git --exec-path)/git-sh-setup"
|
2008-10-16 11:56:19 +01:00
|
|
|
CAIRO_DIR=`dirname $GIT_DIR`
|
|
|
|
|
if [ "$CAIRO_DIR" = "." ]; then
|
|
|
|
|
CAIRO_DIR=`pwd`
|
|
|
|
|
fi
|
|
|
|
|
CAIRO_PERF_DIR=$CAIRO_DIR/.perf
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rev2sha() {
|
|
|
|
|
rev=$1
|
|
|
|
|
git rev-parse --verify $rev || ( echo "Cannot resolve $rev as a git object" && exit 1 )
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cpu_count() {
|
|
|
|
|
test -f /proc/cpuinfo &&
|
|
|
|
|
grep -c '^processor[[:blank:]]\+:' /proc/cpuinfo ||
|
|
|
|
|
echo 1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# We cache performance output based on a two-part name capturing the
|
|
|
|
|
# current performance test suite and the library being tested. We
|
|
|
|
|
# capture these as the tree object of the perf directory in HEAD and
|
|
|
|
|
# the tree object of the src directory of the revision being tested.
|
|
|
|
|
#
|
|
|
|
|
# This way, whenever the performance suite is updated, cached output
|
|
|
|
|
# from old versions of the suite are automatically invalidated. Also,
|
|
|
|
|
# if a commit just changes things outside of the src tree, (say it
|
|
|
|
|
# changes the "test" test suite, or README or configure.in, or
|
|
|
|
|
# whatever), cairo-perf-diff will be smart enough to still use cached
|
|
|
|
|
# results from a run with an equivalent src tree.
|
|
|
|
|
rev2perf() {
|
|
|
|
|
rev=$1
|
|
|
|
|
sha=`rev2sha $rev`
|
|
|
|
|
src_tree_sha=`rev2sha $rev:src`
|
|
|
|
|
perf_tree_sha=`rev2sha HEAD:perf`
|
|
|
|
|
echo "$CAIRO_PERF_DIR/${sha}-${perf_tree_sha}-${src_tree_sha}.perf"
|
|
|
|
|
}
|
|
|
|
|
rev2perf_glob() {
|
|
|
|
|
rev=$1
|
|
|
|
|
src_tree_sha=`rev2sha $rev:src`
|
|
|
|
|
perf_tree_sha=`rev2sha HEAD:perf`
|
|
|
|
|
echo "$CAIRO_PERF_DIR/*-${perf_tree_sha}-${src_tree_sha}.perf"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Usage: run_cairo_perf_if_not_cached <rev> <suffix>
|
|
|
|
|
# The <rev> argument must be a valid git ref-spec that can
|
|
|
|
|
# be resolved to a commit. The suffix is just something
|
|
|
|
|
# unique so that build directories can be separated for
|
|
|
|
|
# multiple calls to this function.
|
|
|
|
|
run_cairo_perf_if_not_cached() {
|
|
|
|
|
rev=$1
|
|
|
|
|
build_dir="build-$2"
|
|
|
|
|
|
|
|
|
|
owd=`pwd`
|
|
|
|
|
sha=`rev2sha $rev`
|
|
|
|
|
perf=`rev2perf $rev`
|
|
|
|
|
glob=`rev2perf_glob $rev`
|
2009-06-20 13:09:46 +01:00
|
|
|
if [ -e $glob ] && [ "$force_cairo_perf" != "true" ] || [ -n "$show_only" ]; then
|
2008-10-16 11:56:19 +01:00
|
|
|
return 0
|
|
|
|
|
fi
|
|
|
|
|
if [ ! -d $CAIRO_PERF_DIR ]; then
|
|
|
|
|
echo "Creating new perf cache in $CAIRO_PERF_DIR"
|
|
|
|
|
mkdir $CAIRO_PERF_DIR
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
cd $CAIRO_DIR
|
|
|
|
|
boilerplate_files=`git ls-tree --name-only HEAD boilerplate/*`
|
|
|
|
|
perf_files=`git ls-tree --name-only HEAD perf/*`
|
|
|
|
|
cd $CAIRO_PERF_DIR
|
|
|
|
|
|
|
|
|
|
if [ ! -d $build_dir ]; then
|
|
|
|
|
git clone -s $CAIRO_DIR $build_dir
|
|
|
|
|
(cd $build_dir; git checkout -b tmp-cairo-perf-diff $sha)
|
|
|
|
|
fi
|
|
|
|
|
cd $build_dir
|
|
|
|
|
|
|
|
|
|
git checkout tmp-cairo-perf-diff
|
|
|
|
|
git reset --hard $sha
|
|
|
|
|
|
|
|
|
|
if [ -z "$MAKEFLAGS" ]; then
|
|
|
|
|
CPU_COUNT=`cpu_count`
|
|
|
|
|
export MAKEFLAGS="-j`expr $CPU_COUNT + 1`"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [ ! -e Makefile ]; then
|
|
|
|
|
CFLAGS="-O2" ./autogen.sh $CAIRO_AUTOGEN_OPTIONS
|
|
|
|
|
fi
|
|
|
|
|
make CFLAGS="-O2" || (rm config.cache && make CFLAGS="-O2")
|
|
|
|
|
for file in $boilerplate_files; do
|
|
|
|
|
rsync $CAIRO_DIR/$file boilerplate
|
|
|
|
|
done
|
|
|
|
|
(cd boilerplate; make)
|
|
|
|
|
for file in $perf_files; do
|
|
|
|
|
rsync $CAIRO_DIR/$file perf
|
|
|
|
|
done
|
|
|
|
|
cd perf;
|
|
|
|
|
make cairo-perf || exit 1
|
|
|
|
|
echo "Running \"cairo-perf $CAIRO_PERF_OPTIONS\" against $rev. Results will be cached in:"
|
|
|
|
|
echo "$perf"
|
|
|
|
|
(./cairo-perf $CAIRO_PERF_OPTIONS || echo "*** Performance test crashed") >> $perf
|
|
|
|
|
cd $owd
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
git_setup
|
|
|
|
|
|
|
|
|
|
# Build cairo-perf-graph-files if not available
|
|
|
|
|
if [ ! -e $CAIRO_DIR/perf/cairo-perf-graph-files ]; then
|
|
|
|
|
echo "Building cairo-perf-graph-files"
|
|
|
|
|
if [ "x$OS" = "xWindows_NT" ]; then
|
|
|
|
|
make -f Makefile.win32 -C $CAIRO_DIR/perf/ cairo-perf-graph-files CFG=debug
|
|
|
|
|
else
|
|
|
|
|
make -C $CAIRO_DIR/perf/ cairo-perf-graph-files
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
revs=""
|
|
|
|
|
for rev in `git rev-list --reverse $old..$new`; do
|
|
|
|
|
run_cairo_perf_if_not_cached $rev rev
|
|
|
|
|
perf=`rev2perf $rev`
|
2009-06-20 13:09:46 +01:00
|
|
|
[ -e "$perf" ] && revs="$revs $perf"
|
2008-10-16 11:56:19 +01:00
|
|
|
done
|
|
|
|
|
|
|
|
|
|
exec $CAIRO_DIR/perf/cairo-perf-graph-files $revs
|
|
|
|
|
#exec $CAIRO_DIR/libtool --mode=execute gdb --args $CAIRO_DIR/perf/cairo-perf-graph-files $revs
|