blob: 94e80784a7f8b1d7acf3e96de845a4b7f3bf38bc [file] [log] [blame]
#!/bin/bash
# DEFAULT VALUES
TESTS=()
MIN_TIME=0.0
MIN_ITER=0
BATCH_MODE=0
GRAPH_LINE=0
GRAPH_ZERO=0
VARIABLES=
# DEFINES
TEST_NAMES=(
LEVELS_VEC3_RELAXED LEVELS_VEC4_RELAXED LEVELS_VEC3_FULL LEVELS_VEC4_FULL BLUR_RADIUS_25 # 00-04
INTRINSIC_BLUR_RADIUS_25 GREYSCALE GRAIN FISHEYE_FULL FISHEYE_RELAXED # 05-09
FISHEYE_APPROXIMATE_FULL FISHEYE_APPROXIMATE_RELAXED VIGNETTE_FULL VIGNETTE_RELAXED VIGNETTE_APPROXIMATE_FULL # 10-14
VIGNETTE_APPROXIMATE_RELAXED GROUP_TEST_EMULATED GROUP_TEST_NATIVE CONVOLVE_3X3 INTRINSICS_CONVOLVE_3X3 # 15-19
COLOR_MATRIX INTRINSICS_COLOR_MATRIX INTRINSICS_COLOR_MATRIX_GREY COPY CROSS_PROCESS_USING_LUT # 20-24
CONVOLVE_5X5 INTRINSICS_CONVOLVE_5X5 MANDELBROT_FLOAT INTRINSICS_BLEND INTRINSICS_BLUR_25G # 25-29
VIBRANCE BW_FILTER SHADOWS CONTRAST EXPOSURE # 30-34
WHITE_BALANCE COLOR_CUBE COLOR_CUBE_3D_INTRINSIC ARTISTIC1 RESIZE_BI_SCRIPT # 35-39
RESIZE_BI_INTRINSIC POSTERIZE_INVOKE POSTERIZE_SET HISTOGRAM_INTRINSIC HISTOGRAM_SCRIPT # 40-44
MANDELBROT_DOUBLE BLUR_RADIUS_25_HALF # 45-46
)
FUNCTION_NAMES=(
testLevelsVec3Relaxed testLevelsVec4Relaxed testLevelsVec3Full testLevelsVec4Full testBlurRadius25 # 00-04
testIntrinsicBlurRadius25 testGreyscale testGrain testFisheyeFull testFishEyeRelaxed # 05-09
testFisheyeApproximateFull testFisheyeApproximateRelaxed testVignetteFull testVignetteRelaxed testVignetteApproximateFull # 10-14
testVignetteApproximateRelaxed testGroupTestEmulated testGroupTestNative testConvolve3x3 testIntrinsicsConvolve3x3 # 15-19
testColorMatrix testIntrinsicsColorMatrix testIntrinsicsColorMatrixGrey testCopy testCrossProcessUsingLUT # 20-24
testConvolve5x5 testIntrinsicsConvolve5x5 testMandelbrot testIntrinsicsBlend testIntrinsicsBlur25G # 25-29
testVibrance testBWFilter testShadows testContrast testExposure # 30-34
testWhiteBalance testColorCube testColorCube3DIntrinsic testArtistic1 testResizeBiCubicScript # 35-39
testResizeBiCubicIntrinsic testPosterizeInvoke testPosterizeSet testHistogramIntrinsic testHistogramScript # 40-44
testMandelbrotfp64 testBlurRadius25Half # 45-46
)
RUNNER="com.android.rs.imagejb/android.support.test.runner.AndroidJUnitRunner"
TEST_ROOT="com.android.rs.imagejb.ImageProcessingTest"
# Helper functions
show_help() {
echo "
Usage: ${0##*/} [OPTIONS]...
Do stuff with FILE and write the result to standard output. With no FILE
or when FILE is -, read standard input.
-h, -?, --?, --help display this help message
-t, --time K set the minimum time (in seconds) each test should run
-i, --iteration[s] K set the minimum number of iterations each test should run
-c, --case[s] T1 [T2]... specify the number corresponding to each test to be run;
the test IDs are below
-b, --batch run all tests together for speed
-f, --bestfit add best fit line to graph
-z, --zero set graph's minimum yrange to 0
"
echo "Available test cases:"
for i in `seq 0 $((${#TEST_NAMES[@]} - 1))`; do
echo " $i: ${TEST_NAMES[$i]}"
done
echo
}
fileexists() {
[ `adb shell "[ -f $1 ] && echo found"` ]
}
# display help if blank argument list
if [ $# -eq 0 ]; then
show_help
exit
fi
# command line parsing
using_cases=0
while [ $# -gt 0 ]; do
case $1 in
-h|-\?|--\?|--help)
show_help
exit
;;
-t|--time)
using_cases=0
if [ -n "$2" ]; then
MIN_TIME=$2
shift
shift
else
echo 'ERROR: "--time" requires a non-empty option argument.'
exit 1
fi
;;
-i|--iter|--iters|--iteration|--iterations)
using_cases=0
if [ -n "$2" ]; then
MIN_ITER=$2
shift
shift
else
echo 'ERROR: "--iteration" requires a non-empty option argument.'
exit 1
fi
;;
-c|--case|--cases)
if [ -n "$2" ]; then
using_cases=1
shift
else
echo 'ERROR: "--case" requires a non-empty option argument.'
exit 1
fi
;;
-b|--batch)
using_cases=0
BATCH_MODE=1
shift
;;
-f|--bestfit)
using_cases=0
GRAPH_LINE=1
shift
;;
-z|--zero)
using_cases=0
GRAPH_ZERO=1
shift
;;
all)
if [ $using_cases -eq 1 ]; then
using_cases=0
TESTS=(`seq 0 $((${#TEST_NAMES[@]} - 1))`)
shift
else
echo "ERROR: Invalid option: $1"
fi
;;
[0-9]*)
if [ $using_cases -eq 1 ]; then
TESTS+=($1)
shift
else
echo "ERROR: Invalid option: $1"
exit 1
fi
;;
*)
echo "ERROR: Invalid option: $1"
exit 1
;;
esac
done
# error checking
if [ ${#TESTS[@]} -eq 0 ]; then
echo "ERROR: need at least one --case"
exit 1
fi
# configure launch variables
if [[ ( $MIN_TIME == "0.0" ) && ( $MIN_ITER -eq 0 ) ]]; then
MIN_TIME=1.0
MIN_ITER=2
fi
VARIABLES="$VARIABLES -e minimum_test_runtime $MIN_TIME -e minimum_test_iterations $MIN_ITER"
TESTS=( `printf "%s\n" "${TESTS[@]}" | sort -n | uniq` )
# print prep
echo
[ $BATCH_MODE -eq 0 ] && echo "Running tests:" || echo "Running tests (in batch mode):"
for i in ${TESTS[@]}; do
echo $i: ${TEST_NAMES[$i]}
done
echo "with minimum runtime per test of $MIN_TIME seconds and
minimum number of $MIN_ITER iterations per test"
echo
# setup
echo
if [[ "`adb shell id | tr -d '\r' | awk -F'[()]' '{print $2}'`" != "root" ]]; then
adb root
adb wait-for-device
fi
# grant permission
adb shell pm grant com.android.rs.imagejb android.permission.READ_EXTERNAL_STORAGE
adb shell pm grant com.android.rs.imagejb android.permission.WRITE_EXTERNAL_STORAGE
# Run each test individually...
if [[ $BATCH_MODE -eq 0 ]]; then
# run and plot each test result separately
for num in `seq 0 $((${#TESTS[@]} - 1))`; do
# alias
testId=${TESTS[$num]}
# report progress
printf "Running ${TEST_NAMES[$testId]} ($(($num + 1))/${#TESTS[@]})"
# run individual test
adb shell "am instrument -w $VARIABLES -e class $TEST_ROOT#${FUNCTION_NAMES[$testId]} $RUNNER" > /dev/null
# extract relevant data if present, write to temporary file
if fileexists /sdcard/rsTimes/${TEST_NAMES[$testId]}_DATA.txt; then
adb shell cat /sdcard/rsTimes/${TEST_NAMES[$testId]}_DATA.txt > timing.tmp
else
printf "\r \r"
echo "File ${TEST_NAMES[$testId]} not saved. Is ImageProcessing_jb able to run on this device?"
continue
fi
# calculate avg and stdcoef
AVG=`cat timing.tmp | awk '{sum+=$2}END{printf "%.2f",sum/NR}'`
STDCOEF=`cat timing.tmp | awk '{sum+=$2;sos+=$2*$2}END{printf "%.2f",sqrt((sos-sum*sum/NR)/NR)/(sum/NR)*100}'`
# create plot file
echo "# temporary file" > plot.tmp
echo "set style line 1 lc rgb '#0060ad' lt 1 lw 2 pt 7 ps 1" >> plot.tmp # --- blue
echo "set style line 2 lc rgb '#ff0000' lt 1 lw 2" >> plot.tmp # --- green
echo "set title \"${TEST_NAMES[$testId]} \(avg=$AVG ms, stdcoef=$STDCOEF%\)\"" >> plot.tmp
echo "set xlabel \"Iteration #\"" >> plot.tmp
echo "set ylabel \"Elapsed Time (ms)\"" >> plot.tmp
if [ $GRAPH_ZERO -eq 1 ]; then
echo "set yrange [0.0:*]" >> plot.tmp
fi
if [ $GRAPH_LINE -eq 1 ]; then
echo "set fit quiet" >> plot.tmp
echo "set fit logfile '/dev/null'" >> plot.tmp
echo "f(x) = a*x + b" >> plot.tmp
echo "fit f(x) 'timing.tmp' using 1:2 via a, b" >> plot.tmp
echo "string = sprintf('%.3fe-3*x+%.3f', a*1000, b)" >> plot.tmp
echo "plot 'timing.tmp' with linespoints ls 1 title 'Data', f(x) ls 2 title string" >> plot.tmp
else
echo "plot 'timing.tmp' with linespoints ls 1 title 'Data'" >> plot.tmp
fi
# plot data as simple line graph
gnuplot -p plot.tmp
# clear line
printf "\r \r"
done
# ...or all at once
else
# concatenate all tests together to run in batch
TESTS_TEXT="-e class $TEST_ROOT#${FUNCTION_NAMES[${TESTS[0]}]}"
for num in `seq 1 $((${#TESTS[@]} - 1))`; do
TESTS_TEXT=$TESTS_TEXT,"$TEST_ROOT#${FUNCTION_NAMES[${TESTS[$num]}]}"
done
# run command
adb shell "am instrument -w $VARIABLES $TESTS_TEXT $RUNNER"
# run and plot each test result separately
for num in `seq 0 $((${#TESTS[@]} - 1))`; do
# alias
testId=${TESTS[$num]}
# extract relevant data if present, write to temporary file
if fileexists /sdcard/rsTimes/${TEST_NAMES[$testId]}_DATA.txt; then
adb shell cat /sdcard/rsTimes/${TEST_NAMES[$testId]}_DATA.txt > timing.tmp
else
echo "File ${TEST_NAMES[$testId]} not saved. Is ImageProcessing_jb able to run on this device?"
continue
fi
# calculate avg and stdcoef
AVG=`cat timing.tmp | awk '{sum+=$2}END{printf "%.2f",sum/NR}'`
STDCOEF=`cat timing.tmp | awk '{sum+=$2;sos+=$2*$2}END{printf "%.2f",sqrt((sos-sum*sum/NR)/NR)/(sum/NR)*100}'`
# create plot file
echo "# temporary file" > plot.tmp
echo "set style line 1 lc rgb '#0060ad' lt 1 lw 2 pt 7 ps 1" >> plot.tmp # --- blue
echo "set style line 2 lc rgb '#ff0000' lt 1 lw 2" >> plot.tmp # --- green
echo "set title \"${TEST_NAMES[$testId]} \(avg=$AVG ms, stdcoef=$STDCOEF%\)\"" >> plot.tmp
echo "set xlabel \"Iteration #\"" >> plot.tmp
echo "set ylabel \"Elapsed Time (ms)\"" >> plot.tmp
if [ $GRAPH_ZERO -eq 1 ]; then
echo "set yrange [0.0:*]" >> plot.tmp
fi
if [ $GRAPH_LINE -eq 1 ]; then
echo "set fit quiet" >> plot.tmp
echo "set fit logfile '/dev/null'" >> plot.tmp
echo "f(x) = a*x + b" >> plot.tmp
echo "fit f(x) 'timing.tmp' using 1:2 via a, b" >> plot.tmp
echo "string = sprintf('%.3fe-3*x+%.3f', a*1000, b)" >> plot.tmp
echo "plot 'timing.tmp' with linespoints ls 1 title 'Data', f(x) ls 2 title string" >> plot.tmp
else
echo "plot 'timing.tmp' with linespoints ls 1 title 'Data'" >> plot.tmp
fi
# plot data as simple line graph
gnuplot -p plot.tmp
done
fi # single or batch mode
# cleanup
rm -f plot.tmp
rm -f timing.tmp