diff options
Diffstat (limited to 'libs/cairo-1.16.0/perf/cairo-perf-diff')
| -rwxr-xr-x | libs/cairo-1.16.0/perf/cairo-perf-diff | 255 | 
1 files changed, 255 insertions, 0 deletions
| diff --git a/libs/cairo-1.16.0/perf/cairo-perf-diff b/libs/cairo-1.16.0/perf/cairo-perf-diff new file mode 100755 index 0000000..5a4b7b3 --- /dev/null +++ b/libs/cairo-1.16.0/perf/cairo-perf-diff @@ -0,0 +1,255 @@ +#!/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 | 
