Home | History | Annotate | Download | only in perf-test-scripts
      1 #!/bin/bash
      2 
      3 
      4 # DEFAULT VALUES
      5 TESTS=()
      6 MIN_TIME=0.0
      7 MIN_ITER=0
      8 BATCH_MODE=0
      9 GRAPH_LINE=0
     10 GRAPH_ZERO=0
     11 VARIABLES=
     12 
     13 
     14 # DEFINES
     15 TEST_NAMES=(
     16   LEVELS_VEC3_RELAXED            LEVELS_VEC4_RELAXED           LEVELS_VEC3_FULL              LEVELS_VEC4_FULL       BLUR_RADIUS_25              # 00-04
     17   INTRINSIC_BLUR_RADIUS_25       GREYSCALE                     GRAIN                         FISHEYE_FULL           FISHEYE_RELAXED             # 05-09
     18   FISHEYE_APPROXIMATE_FULL       FISHEYE_APPROXIMATE_RELAXED   VIGNETTE_FULL                 VIGNETTE_RELAXED       VIGNETTE_APPROXIMATE_FULL   # 10-14
     19   VIGNETTE_APPROXIMATE_RELAXED   GROUP_TEST_EMULATED           GROUP_TEST_NATIVE             CONVOLVE_3X3           INTRINSICS_CONVOLVE_3X3     # 15-19
     20   COLOR_MATRIX                   INTRINSICS_COLOR_MATRIX       INTRINSICS_COLOR_MATRIX_GREY  COPY                   CROSS_PROCESS_USING_LUT     # 20-24
     21   CONVOLVE_5X5                   INTRINSICS_CONVOLVE_5X5       MANDELBROT_FLOAT              INTRINSICS_BLEND       INTRINSICS_BLUR_25G         # 25-29
     22   VIBRANCE                       BW_FILTER                     SHADOWS                       CONTRAST               EXPOSURE                    # 30-34
     23   WHITE_BALANCE                  COLOR_CUBE                    COLOR_CUBE_3D_INTRINSIC       ARTISTIC1              RESIZE_BI_SCRIPT            # 35-39
     24   RESIZE_BI_INTRINSIC            POSTERIZE_INVOKE              POSTERIZE_SET                 HISTOGRAM_INTRINSIC    HISTOGRAM_SCRIPT            # 40-44
     25   MANDELBROT_DOUBLE              BLUR_RADIUS_25_HALF                                                                                            # 45-46
     26 )
     27 
     28 FUNCTION_NAMES=(
     29   testLevelsVec3Relaxed          testLevelsVec4Relaxed         testLevelsVec3Full            testLevelsVec4Full     testBlurRadius25            # 00-04
     30   testIntrinsicBlurRadius25      testGreyscale                 testGrain                     testFisheyeFull        testFishEyeRelaxed          # 05-09
     31   testFisheyeApproximateFull     testFisheyeApproximateRelaxed testVignetteFull              testVignetteRelaxed    testVignetteApproximateFull # 10-14
     32   testVignetteApproximateRelaxed testGroupTestEmulated         testGroupTestNative           testConvolve3x3        testIntrinsicsConvolve3x3   # 15-19
     33   testColorMatrix                testIntrinsicsColorMatrix     testIntrinsicsColorMatrixGrey testCopy               testCrossProcessUsingLUT    # 20-24
     34   testConvolve5x5                testIntrinsicsConvolve5x5     testMandelbrot                testIntrinsicsBlend    testIntrinsicsBlur25G       # 25-29
     35   testVibrance                   testBWFilter                  testShadows                   testContrast           testExposure                # 30-34
     36   testWhiteBalance               testColorCube                 testColorCube3DIntrinsic      testArtistic1          testResizeBiCubicScript     # 35-39
     37   testResizeBiCubicIntrinsic     testPosterizeInvoke           testPosterizeSet              testHistogramIntrinsic testHistogramScript         # 40-44
     38   testMandelbrotfp64             testBlurRadius25Half                                                                                           # 45-46
     39 )
     40 
     41 RUNNER="com.android.rs.imagejb/android.support.test.runner.AndroidJUnitRunner"
     42 TEST_ROOT="com.android.rs.imagejb.ImageProcessingTest"
     43 
     44 
     45 # Helper functions
     46 show_help() {
     47   echo "
     48     Usage: ${0##*/} [OPTIONS]...
     49     Do stuff with FILE and write the result to standard output. With no FILE
     50     or when FILE is -, read standard input.
     51 
     52     -h, -?, --?, --help      display this help message
     53     -t, --time K             set the minimum time (in seconds) each test should run
     54     -i, --iteration[s] K     set the minimum number of iterations each test should run
     55     -c, --case[s] T1 [T2]... specify the number corresponding to each test to be run;
     56                              the test IDs are below
     57     -b, --batch              run all tests together for speed
     58     -f, --bestfit            add best fit line to graph
     59     -z, --zero               set graph's minimum yrange to 0
     60   "
     61   echo "Available test cases:"
     62   for i in `seq 0 $((${#TEST_NAMES[@]} - 1))`; do
     63     echo "  $i: ${TEST_NAMES[$i]}"
     64   done
     65   echo
     66 }
     67 fileexists() {
     68   [ `adb shell "[ -f $1 ] && echo found"` ]
     69 }
     70 
     71 
     72 # display help if blank argument list
     73 if [ $# -eq 0 ]; then
     74   show_help
     75   exit
     76 fi
     77 
     78 # command line parsing
     79 using_cases=0
     80 while [ $# -gt 0 ]; do
     81   case $1 in
     82     -h|-\?|--\?|--help)
     83       show_help
     84       exit
     85       ;;
     86     -t|--time)
     87       using_cases=0
     88       if [ -n "$2" ]; then
     89         MIN_TIME=$2
     90         shift
     91         shift
     92       else
     93         echo 'ERROR: "--time" requires a non-empty option argument.'
     94         exit 1
     95       fi
     96       ;;
     97     -i|--iter|--iters|--iteration|--iterations)
     98       using_cases=0
     99       if [ -n "$2" ]; then
    100         MIN_ITER=$2
    101         shift
    102         shift
    103       else
    104         echo 'ERROR: "--iteration" requires a non-empty option argument.'
    105         exit 1
    106       fi
    107       ;;
    108     -c|--case|--cases)
    109       if [ -n "$2" ]; then
    110         using_cases=1
    111         shift
    112       else
    113         echo 'ERROR: "--case" requires a non-empty option argument.'
    114         exit 1
    115       fi
    116       ;;
    117     -b|--batch)
    118       using_cases=0
    119       BATCH_MODE=1
    120       shift
    121       ;;
    122     -f|--bestfit)
    123       using_cases=0
    124       GRAPH_LINE=1
    125       shift
    126       ;;
    127     -z|--zero)
    128       using_cases=0
    129       GRAPH_ZERO=1
    130       shift
    131       ;;
    132     all)
    133       if [ $using_cases -eq 1 ]; then
    134         using_cases=0
    135         TESTS=(`seq 0 $((${#TEST_NAMES[@]} - 1))`)
    136         shift
    137       else
    138         echo "ERROR: Invalid option: $1"
    139       fi
    140       ;;
    141     [0-9]*)
    142       if [ $using_cases -eq 1 ]; then
    143         TESTS+=($1)
    144         shift
    145       else
    146         echo "ERROR: Invalid option: $1"
    147         exit 1
    148       fi
    149       ;;
    150     *)
    151       echo "ERROR: Invalid option: $1"
    152       exit 1
    153       ;;
    154   esac
    155 done
    156 
    157 # error checking
    158 if [ ${#TESTS[@]} -eq 0 ]; then
    159   echo "ERROR: need at least one --case"
    160   exit 1
    161 fi
    162 
    163 # configure launch variables
    164 if [[ ( $MIN_TIME == "0.0" ) && ( $MIN_ITER -eq 0 ) ]]; then
    165   MIN_TIME=1.0
    166   MIN_ITER=2
    167 fi
    168 VARIABLES="$VARIABLES -e minimum_test_runtime $MIN_TIME -e minimum_test_iterations $MIN_ITER"
    169 TESTS=( `printf "%s\n" "${TESTS[@]}" | sort -n | uniq` )
    170 
    171 # print prep
    172 echo
    173 [ $BATCH_MODE -eq 0 ] && echo "Running tests:" || echo "Running tests (in batch mode):"
    174 for i in ${TESTS[@]}; do
    175   echo $i: ${TEST_NAMES[$i]}
    176 done
    177 echo "with minimum runtime per test of $MIN_TIME seconds and
    178 minimum number of $MIN_ITER iterations per test"
    179 echo
    180 
    181 # setup
    182 echo
    183 if [[ "`adb shell id | tr -d '\r' | awk -F'[()]' '{print $2}'`" != "root" ]]; then
    184   adb root
    185   adb wait-for-device
    186 fi
    187 
    188 # grant permission
    189 adb shell pm grant com.android.rs.imagejb android.permission.READ_EXTERNAL_STORAGE
    190 adb shell pm grant com.android.rs.imagejb android.permission.WRITE_EXTERNAL_STORAGE
    191 
    192 # Run each test individually...
    193 if [[ $BATCH_MODE -eq 0 ]]; then
    194 
    195   # run and plot each test result separately
    196   for num in `seq 0 $((${#TESTS[@]} - 1))`; do
    197 
    198     # alias
    199     testId=${TESTS[$num]}
    200 
    201     # report progress
    202     printf "Running ${TEST_NAMES[$testId]} ($(($num + 1))/${#TESTS[@]})"
    203 
    204     # run individual test
    205     adb shell "am instrument -w $VARIABLES -e class $TEST_ROOT#${FUNCTION_NAMES[$testId]} $RUNNER" > /dev/null
    206 
    207     # extract relevant data if present, write to temporary file
    208     if fileexists /sdcard/rsTimes/${TEST_NAMES[$testId]}_DATA.txt; then
    209       adb shell cat /sdcard/rsTimes/${TEST_NAMES[$testId]}_DATA.txt > timing.tmp
    210     else
    211       printf "\r                                                                       \r"
    212       echo "File ${TEST_NAMES[$testId]} not saved. Is ImageProcessing_jb able to run on this device?"
    213       continue
    214     fi
    215 
    216     # calculate avg and stdcoef
    217     AVG=`cat timing.tmp | awk '{sum+=$2}END{printf "%.2f",sum/NR}'`
    218     STDCOEF=`cat timing.tmp | awk '{sum+=$2;sos+=$2*$2}END{printf "%.2f",sqrt((sos-sum*sum/NR)/NR)/(sum/NR)*100}'`
    219 
    220     # create plot file
    221     echo "# temporary file" > plot.tmp
    222     echo "set style line 1 lc rgb '#0060ad' lt 1 lw 2 pt 7 ps 1" >> plot.tmp  # --- blue
    223     echo "set style line 2 lc rgb '#ff0000' lt 1 lw 2" >> plot.tmp  # --- green
    224     echo "set title \"${TEST_NAMES[$testId]} \(avg=$AVG ms, stdcoef=$STDCOEF%\)\"" >> plot.tmp
    225     echo "set xlabel \"Iteration #\"" >> plot.tmp
    226     echo "set ylabel \"Elapsed Time (ms)\"" >> plot.tmp
    227     if [ $GRAPH_ZERO -eq 1 ]; then
    228       echo "set yrange [0.0:*]" >> plot.tmp
    229     fi
    230     if [ $GRAPH_LINE -eq 1 ]; then
    231       echo "set fit quiet" >> plot.tmp
    232       echo "set fit logfile '/dev/null'" >> plot.tmp
    233       echo "f(x) = a*x + b" >> plot.tmp
    234       echo "fit f(x) 'timing.tmp' using 1:2 via a, b" >> plot.tmp
    235       echo "string = sprintf('%.3fe-3*x+%.3f', a*1000, b)" >> plot.tmp
    236       echo "plot 'timing.tmp' with linespoints ls 1 title 'Data', f(x) ls 2 title string" >> plot.tmp
    237     else
    238       echo "plot 'timing.tmp' with linespoints ls 1 title 'Data'" >> plot.tmp
    239     fi
    240 
    241     # plot data as simple line graph
    242     gnuplot -p plot.tmp
    243 
    244     # clear line
    245     printf "\r                                                                       \r"
    246 
    247   done
    248 
    249 # ...or all at once
    250 else
    251 
    252   # concatenate all tests together to run in batch
    253   TESTS_TEXT="-e class $TEST_ROOT#${FUNCTION_NAMES[${TESTS[0]}]}"
    254   for num in `seq 1 $((${#TESTS[@]} - 1))`; do
    255     TESTS_TEXT=$TESTS_TEXT,"$TEST_ROOT#${FUNCTION_NAMES[${TESTS[$num]}]}"
    256   done
    257 
    258   # run command
    259   adb shell "am instrument -w $VARIABLES $TESTS_TEXT $RUNNER"
    260 
    261   # run and plot each test result separately
    262   for num in `seq 0 $((${#TESTS[@]} - 1))`; do
    263 
    264     # alias
    265     testId=${TESTS[$num]}
    266 
    267     # extract relevant data if present, write to temporary file
    268     if fileexists /sdcard/rsTimes/${TEST_NAMES[$testId]}_DATA.txt; then
    269       adb shell cat /sdcard/rsTimes/${TEST_NAMES[$testId]}_DATA.txt > timing.tmp
    270     else
    271       echo "File ${TEST_NAMES[$testId]} not saved. Is ImageProcessing_jb able to run on this device?"
    272       continue
    273     fi
    274 
    275     # calculate avg and stdcoef
    276     AVG=`cat timing.tmp | awk '{sum+=$2}END{printf "%.2f",sum/NR}'`
    277     STDCOEF=`cat timing.tmp | awk '{sum+=$2;sos+=$2*$2}END{printf "%.2f",sqrt((sos-sum*sum/NR)/NR)/(sum/NR)*100}'`
    278 
    279     # create plot file
    280     echo "# temporary file" > plot.tmp
    281     echo "set style line 1 lc rgb '#0060ad' lt 1 lw 2 pt 7 ps 1" >> plot.tmp  # --- blue
    282     echo "set style line 2 lc rgb '#ff0000' lt 1 lw 2" >> plot.tmp  # --- green
    283     echo "set title \"${TEST_NAMES[$testId]} \(avg=$AVG ms, stdcoef=$STDCOEF%\)\"" >> plot.tmp
    284     echo "set xlabel \"Iteration #\"" >> plot.tmp
    285     echo "set ylabel \"Elapsed Time (ms)\"" >> plot.tmp
    286     if [ $GRAPH_ZERO -eq 1 ]; then
    287       echo "set yrange [0.0:*]" >> plot.tmp
    288     fi
    289     if [ $GRAPH_LINE -eq 1 ]; then
    290       echo "set fit quiet" >> plot.tmp
    291       echo "set fit logfile '/dev/null'" >> plot.tmp
    292       echo "f(x) = a*x + b" >> plot.tmp
    293       echo "fit f(x) 'timing.tmp' using 1:2 via a, b" >> plot.tmp
    294       echo "string = sprintf('%.3fe-3*x+%.3f', a*1000, b)" >> plot.tmp
    295       echo "plot 'timing.tmp' with linespoints ls 1 title 'Data', f(x) ls 2 title string" >> plot.tmp
    296     else
    297       echo "plot 'timing.tmp' with linespoints ls 1 title 'Data'" >> plot.tmp
    298     fi
    299 
    300     # plot data as simple line graph
    301     gnuplot -p plot.tmp
    302 
    303   done
    304 
    305 fi # single or batch mode
    306 
    307 # cleanup
    308 rm -f plot.tmp
    309 rm -f timing.tmp
    310 
    311 
    312