| #!/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";; |
| -s|--show) show_only="true";; |
| *) 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' |
| . "$(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` |
| 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` |
| if [ -e $glob ] && [ "$force_cairo_perf" != "true" ] || [ -n "$show_only" ]; 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/*` |
| 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` |
| [ -e "$perf" ] && revs="$revs $perf" |
| 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 |