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