blob: 6fe245c14c5ad1c192aadfc2dff8c8d6fb6475a2 [file] [log] [blame]
#! /bin/bash
# A wrapper over perf to provide similar functionality to timeit.c
REPORT=/dev/stderr
INPUT=/dev/stdin
OUTPUT=/dev/stdout
ERRPUT=/dev/stderr
PERFSTAT=perfstats
APPEND_STATUS=0
while [[ $1 = -* ]]; do
if [ $1 = "--summary" ]; then
REPORT=$2
PERFSTAT="$REPORT.perfstats"
elif [ $1 = "--redirect-input" ]; then
INPUT=$2
elif [ $1 = "--redirect-output" ]; then
OUTPUT=$2
ERRPUT=$2
elif [ $1 = "--redirect-stdout" ]; then
OUTPUT=$2
elif [ $1 = "--chdir" ]; then
cd $2
elif [ $1 = "--append-exitstatus" ]; then
APPEND_STATUS=1
shift 1
continue
fi
shift 2
done
if [ "$OUTPUT" = "$ERRPUT" ]; then
# Use >& to ensure the streams are properly interleaved.
perf stat -o $PERFSTAT $@ < $INPUT >& $OUTPUT
else
perf stat -o $PERFSTAT $@ < $INPUT > $OUTPUT 2> $ERRPUT
fi
EXITCODE=$?
if [ "$APPEND_STATUS" = "1" ]; then
echo "exit $EXITCODE" >> $OUTPUT
# When --append-exitstatus is used, timeit will append the
# exit status to the output file and return 0. Model this
# behaviour here.
EXITCODE=0
fi
echo exit $EXITCODE > $REPORT
awk -F' ' '{if ($2 ~ /^task-clock/ || $3 ~ /^task-clock/) {gsub(/,/,"",$1);print "user",$1/1000;} else if($2 == "seconds" && $4 == "elapsed") print "real",$1;}' $PERFSTAT >> $REPORT
exit $EXITCODE