#!/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