| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- #!/bin/sh
- set -e
- usage() {
- argv0=`basename $0`
- cat >&2 << END
- Usage:
- For comparing files created my cairo-perf:
- $argv0 old.perf new.perf
- For comparing (cached) performance of revisions:
- $argv0 [OPTIONS] <revision> [-- cairo-perf options]
- $argv0 [OPTIONS] <rev1> <rev2> [-- cairo-perf-options]
- If given a single revision, compares its results to that of its
- (first-parent) predecessor. Otherwise compares the two given revisions.
- The revisions can be any revision accepted by git. For example:
- $argv0 HEAD # Show impact of latest commit
- $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.
- -t, --trace
- Compare performance using trace replays instead of
- microbenchmarks.
- 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
- }
- benchmark="cairo-perf-micro"
- # First, pull off any known options
- while true; do
- case $1 in
- -f|--force) force_cairo_perf="true";;
- -h|--html) html_output="$2"; shift ;;
- -t|--trace) benchmark="cairo-perf-trace";;
- *) 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
- if [ $# -eq 1 ] || [ "$2" = "--" ]; then
- old="$1^"
- new="$1"
- shift 1
- else
- old="$1"
- new="$2"
- shift 2
- fi
- # And post-finally, pass anything after -- on to cairo-perf
- CAIRO_PERF_OPTIONS="-r -i 10"
- if [ $# -gt 0 ]; then
- if [ "$1" = "--" ]; then
- shift 1
- CAIRO_PERF_OPTIONS="$CAIRO_PERF_OPTIONS $@"
- else
- usage
- fi
- fi
- git_setup() {
- SUBDIRECTORY_OK='Yes'
- . "$(git --exec-path)/git-sh-setup"
- 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`
- script_tree_sha=`rev2sha HEAD:util/cairo-script`
- echo "$CAIRO_PERF_DIR/${sha}-${perf_tree_sha}-${script_tree_sha}-${src_tree_sha}.perf"
- }
- rev2perf_glob() {
- rev=$1
- src_tree_sha=`rev2sha $rev:src`
- perf_tree_sha=`rev2sha HEAD:perf`
- script_tree_sha=`rev2sha HEAD:util/cairo-script`
- echo "$CAIRO_PERF_DIR/*-${perf_tree_sha}-${script_tree_sha}-${src_tree_sha}.perf"
- }
- build() {
- build_dir=$1
- sha=$2
- 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
- ./autogen.sh $CAIRO_AUTOGEN_OPTIONS
- fi
- for file in $boilerplate_files; do
- rsync $CAIRO_DIR/$file boilerplate
- done
- for file in $perf_files; do
- rsync $CAIRO_DIR/$file perf
- done
- for file in $script_files; do
- rsync $CAIRO_DIR/$file util/cairo-script
- done
- make || (rm config.cache && make)
- (cd boilerplate && make libcairoboilerplate.la)
- cd perf
- make ${benchmark}
- }
- # 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`
- if [ -e $glob ] && [ "$force_cairo_perf" != "true" ]; then
- 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/*`
- script_files=`git ls-tree --name-only HEAD util/cairo-script/*`
- cd $CAIRO_PERF_DIR
- build $build_dir $sha || {
- rm -rf $build_dir
- build $build_dir $sha || exit 1
- }
- echo "Running \"cairo-perf $CAIRO_PERF_OPTIONS\" against $rev. Results will be cached in:"
- { ./$benchmark $CAIRO_PERF_OPTIONS || echo "*** Performance test crashed"; } >> $perf
- cd $owd
- }
- git_setup
- if [ -e ./cairo-perf-diff-files ]; then
- bindir="."
- else
- bindir=$CAIRO_DIR/perf
- # Build cairo-perf-diff-files if not available
- if [ ! -e $bindir/cairo-perf-diff-files ]; then
- echo "Building cairo-perf-diff-files"
- if [ "x$OS" = "xWindows_NT" ]; then
- make -f Makefile.win32 -C $bindir cairo-perf-diff-files CFG=debug
- else
- make -C $bindir cairo-perf-diff-files
- fi
- fi
- fi
- if [ ! -e $old ]; then
- run_cairo_perf_if_not_cached $old old
- old=`rev2perf $old`
- fi
- if [ ! -e $new ]; then
- run_cairo_perf_if_not_cached $new new
- new=`rev2perf $new`
- fi
- if [ -z "$html_output" ]; then
- $bindir/cairo-perf-diff-files $old $new
- else
- $bindir/cairo-perf-diff-files $old $new |
- $CAIRO_DIR/perf/make-html.py > $html_output
- fi
|