1*288bf522SAndroid Build Coastguard Worker# print summary of output generated by pwrtest.sh 2*288bf522SAndroid Build Coastguard Worker# 3*288bf522SAndroid Build Coastguard Worker# default results directories are <device>-<date>[-experiment]. By default 4*288bf522SAndroid Build Coastguard Worker# match any device and the year 201*. 5*288bf522SAndroid Build Coastguard Worker# 6*288bf522SAndroid Build Coastguard Worker# Examples: 7*288bf522SAndroid Build Coastguard Worker# 8*288bf522SAndroid Build Coastguard Worker# - show output for all bullhead tests in july 2015: 9*288bf522SAndroid Build Coastguard Worker# ./pwrsummary.sh -r "bh-201507*" 10*288bf522SAndroid Build Coastguard Worker# 11*288bf522SAndroid Build Coastguard Worker# - generate CSV file for import into spreadsheet: 12*288bf522SAndroid Build Coastguard Worker# ./pwrsummary.sh -o csv 13*288bf522SAndroid Build Coastguard Worker# 14*288bf522SAndroid Build Coastguard Worker 15*288bf522SAndroid Build Coastguard WorkerCMDDIR=$(dirname $0 2>/dev/null) 16*288bf522SAndroid Build Coastguard WorkerCMDDIR=${CMDDIR:=.} 17*288bf522SAndroid Build Coastguard Workercd $CMDDIR 18*288bf522SAndroid Build Coastguard WorkerCMDDIR=$(pwd) 19*288bf522SAndroid Build Coastguard Workercd - 20*288bf522SAndroid Build Coastguard WorkerPOWERAVE="python $CMDDIR/powerave.py" 21*288bf522SAndroid Build Coastguard Worker 22*288bf522SAndroid Build Coastguard WorkerdefaultPattern="*-201*" 23*288bf522SAndroid Build Coastguard WorkerdefaultVoltage=4.3 24*288bf522SAndroid Build Coastguard WorkerdefaultFrequency=5 25*288bf522SAndroid Build Coastguard Worker 26*288bf522SAndroid Build Coastguard Workerfunction Usage { 27*288bf522SAndroid Build Coastguard Worker echo "$0 [-o format] [-v voltage] [-h freq] [-f resultsDirectories]" 28*288bf522SAndroid Build Coastguard Worker} 29*288bf522SAndroid Build Coastguard Worker 30*288bf522SAndroid Build Coastguard Workerwhile [ $# -gt 0 ] 31*288bf522SAndroid Build Coastguard Workerdo 32*288bf522SAndroid Build Coastguard Worker case "$1" in 33*288bf522SAndroid Build Coastguard Worker (-o) format=$2; shift;; 34*288bf522SAndroid Build Coastguard Worker (-v) voltage=$2; shift;; 35*288bf522SAndroid Build Coastguard Worker (-h) hz=$2; shift;; 36*288bf522SAndroid Build Coastguard Worker (-r) testResults="$2"; shift;; 37*288bf522SAndroid Build Coastguard Worker (--help) Usage; exit 0;; 38*288bf522SAndroid Build Coastguard Worker (--) shift; break;; 39*288bf522SAndroid Build Coastguard Worker (*) 40*288bf522SAndroid Build Coastguard Worker echo Unknown option: $1 41*288bf522SAndroid Build Coastguard Worker Usage 42*288bf522SAndroid Build Coastguard Worker exit 1;; 43*288bf522SAndroid Build Coastguard Worker esac 44*288bf522SAndroid Build Coastguard Worker shift 45*288bf522SAndroid Build Coastguard Workerdone 46*288bf522SAndroid Build Coastguard Worker 47*288bf522SAndroid Build Coastguard WorkertestResults=${testResults:=$defaultPattern} 48*288bf522SAndroid Build Coastguard Workervoltage=${voltage:=$defaultVoltage} 49*288bf522SAndroid Build Coastguard Workerhz=${hz:=$defaultFrequency} 50*288bf522SAndroid Build Coastguard Worker 51*288bf522SAndroid Build Coastguard Workerfunction printHeader { 52*288bf522SAndroid Build Coastguard Worker workload=$1 53*288bf522SAndroid Build Coastguard Worker units="unknown" 54*288bf522SAndroid Build Coastguard Worker case $workload in 55*288bf522SAndroid Build Coastguard Worker (suntemple|shadowgrid2) 56*288bf522SAndroid Build Coastguard Worker units="FPS";; 57*288bf522SAndroid Build Coastguard Worker (recentfling|youtube|chrome) 58*288bf522SAndroid Build Coastguard Worker units="FPS from app point of view: 1/(90th percentile render time)";; 59*288bf522SAndroid Build Coastguard Worker (sysapps) 60*288bf522SAndroid Build Coastguard Worker units="App start/switch per second";; 61*288bf522SAndroid Build Coastguard Worker esac 62*288bf522SAndroid Build Coastguard Worker 63*288bf522SAndroid Build Coastguard Worker echo "Performance unit for $workload is: $units" 64*288bf522SAndroid Build Coastguard Worker if [ "$format" = csv ]; then 65*288bf522SAndroid Build Coastguard Worker printf "%s,%s,%s,%s,%s,%s,%s,%s,%s\n" " " build min ave max net-mA@${voltage}v base-mW net-mW perf/W 66*288bf522SAndroid Build Coastguard Worker else 67*288bf522SAndroid Build Coastguard Worker printf "%-30s %-8s %12.12s %12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n" " " build min ave max net-mA@${voltage}v base-mW net-mW perf/W 68*288bf522SAndroid Build Coastguard Worker fi 69*288bf522SAndroid Build Coastguard Worker} 70*288bf522SAndroid Build Coastguard Worker 71*288bf522SAndroid Build Coastguard Workerfunction average { 72*288bf522SAndroid Build Coastguard Worker awk 'BEGIN { count=0; sum=0; max=-1000000000; min=1000000000; } 73*288bf522SAndroid Build Coastguard Worker { 74*288bf522SAndroid Build Coastguard Worker cur = $1; 75*288bf522SAndroid Build Coastguard Worker sum = sum + cur; 76*288bf522SAndroid Build Coastguard Worker if (cur > max) max = cur; 77*288bf522SAndroid Build Coastguard Worker if (cur < min) min = cur; 78*288bf522SAndroid Build Coastguard Worker count++; 79*288bf522SAndroid Build Coastguard Worker } 80*288bf522SAndroid Build Coastguard Worker 81*288bf522SAndroid Build Coastguard Worker END { 82*288bf522SAndroid Build Coastguard Worker if (count > 0) { 83*288bf522SAndroid Build Coastguard Worker ave = sum / count; 84*288bf522SAndroid Build Coastguard Worker printf "%.2f %.2f %.2f\n", min, ave, max; 85*288bf522SAndroid Build Coastguard Worker } 86*288bf522SAndroid Build Coastguard Worker }' 87*288bf522SAndroid Build Coastguard Worker} 88*288bf522SAndroid Build Coastguard Worker 89*288bf522SAndroid Build Coastguard Workerfunction hwuiOutputParser { 90*288bf522SAndroid Build Coastguard Worker # Stats since: 60659316905953ns 91*288bf522SAndroid Build Coastguard Worker # Total frames rendered: 150 92*288bf522SAndroid Build Coastguard Worker # Janky frames: 89 (59.33%) 93*288bf522SAndroid Build Coastguard Worker # 90th percentile: 23ms 94*288bf522SAndroid Build Coastguard Worker # 95th percentile: 27ms 95*288bf522SAndroid Build Coastguard Worker # 99th percentile: 32ms 96*288bf522SAndroid Build Coastguard Worker # Number Missed Vsync: 0 97*288bf522SAndroid Build Coastguard Worker # Number High input latency: 0 98*288bf522SAndroid Build Coastguard Worker # Number Slow UI thread: 0 99*288bf522SAndroid Build Coastguard Worker # Number Slow bitmap uploads: 12 100*288bf522SAndroid Build Coastguard Worker # Number Slow draw: 89 101*288bf522SAndroid Build Coastguard Worker # use with "stdbuf -o0 " to disable pipe buffering 102*288bf522SAndroid Build Coastguard Worker # stdbuf -o0 adb shell /data/local/tmp/hwuimacro shadowgrid2 400 | stdbuf -o0 ./hwuitestfilter.sh | tee t.csv 103*288bf522SAndroid Build Coastguard Worker sed -e 's/ns//' -e 's/[\(\)%]/ /g' | awk ' 104*288bf522SAndroid Build Coastguard Worker BEGIN { startTime=0; lastTime=0; } 105*288bf522SAndroid Build Coastguard Worker /^Stats since:/ { 106*288bf522SAndroid Build Coastguard Worker curTime = $3; 107*288bf522SAndroid Build Coastguard Worker if (startTime == 0) { 108*288bf522SAndroid Build Coastguard Worker startTime = curTime; 109*288bf522SAndroid Build Coastguard Worker } 110*288bf522SAndroid Build Coastguard Worker if (lastTime) { 111*288bf522SAndroid Build Coastguard Worker interval = curTime - lastTime; 112*288bf522SAndroid Build Coastguard Worker fps = totalFrames*1000000000 / interval; 113*288bf522SAndroid Build Coastguard Worker diffTime = curTime - startTime; 114*288bf522SAndroid Build Coastguard Worker printf "%.2f, %.2f, ",diffTime/1000000, fps; 115*288bf522SAndroid Build Coastguard Worker } 116*288bf522SAndroid Build Coastguard Worker } 117*288bf522SAndroid Build Coastguard Worker /^Total frames/ { totalFrames=$4; } 118*288bf522SAndroid Build Coastguard Worker /^Janky frames:/ { 119*288bf522SAndroid Build Coastguard Worker if (lastTime) { 120*288bf522SAndroid Build Coastguard Worker printf "%.2f\n",$4; lastTime=curTime; 121*288bf522SAndroid Build Coastguard Worker } 122*288bf522SAndroid Build Coastguard Worker lastTime = curTime; 123*288bf522SAndroid Build Coastguard Worker }' 124*288bf522SAndroid Build Coastguard Worker} 125*288bf522SAndroid Build Coastguard Worker 126*288bf522SAndroid Build Coastguard Workerfunction sysappOutputParser { 127*288bf522SAndroid Build Coastguard Worker awk ' 128*288bf522SAndroid Build Coastguard Worker BEGIN { fmt=0; count=0; sum=0; } 129*288bf522SAndroid Build Coastguard Worker /^App/ { 130*288bf522SAndroid Build Coastguard Worker if (count != 0) { 131*288bf522SAndroid Build Coastguard Worker if (fmt > 2) printf "Ave: %0.2fms\n", sum/count; 132*288bf522SAndroid Build Coastguard Worker else printf " %0.2f\n", sum/count; 133*288bf522SAndroid Build Coastguard Worker count = 0; 134*288bf522SAndroid Build Coastguard Worker sum = 0; 135*288bf522SAndroid Build Coastguard Worker } 136*288bf522SAndroid Build Coastguard Worker } 137*288bf522SAndroid Build Coastguard Worker /^[a-z]/ { val=$2; if (val != 0) { count++; sum+=val; } } 138*288bf522SAndroid Build Coastguard Worker /^Iteration/ { if (fmt > 2) printf "%s : ", $0; else if (fmt) printf "%d ", $2; } 139*288bf522SAndroid Build Coastguard Worker ' 140*288bf522SAndroid Build Coastguard Worker} 141*288bf522SAndroid Build Coastguard Worker 142*288bf522SAndroid Build Coastguard Workerfunction calcPerfData { 143*288bf522SAndroid Build Coastguard Worker testdir=$1 144*288bf522SAndroid Build Coastguard Worker workload=$2 145*288bf522SAndroid Build Coastguard Worker baselineCurrent=$3 146*288bf522SAndroid Build Coastguard Worker baselinePower=$4 147*288bf522SAndroid Build Coastguard Worker 148*288bf522SAndroid Build Coastguard Worker file=${workload}.out 149*288bf522SAndroid Build Coastguard Worker powerfile=${workload}-power.out 150*288bf522SAndroid Build Coastguard Worker build="$(cat build 2>/dev/null)" 151*288bf522SAndroid Build Coastguard Worker build=${build:="Unknown"} 152*288bf522SAndroid Build Coastguard Worker 153*288bf522SAndroid Build Coastguard Worker lines=$(wc -l $file 2>/dev/null | cut -f1 -d\ ) 154*288bf522SAndroid Build Coastguard Worker 155*288bf522SAndroid Build Coastguard Worker if [ ${lines:=0} -eq -0 ]; then 156*288bf522SAndroid Build Coastguard Worker # No performance data captured 157*288bf522SAndroid Build Coastguard Worker if [ "$format" = csv ]; then 158*288bf522SAndroid Build Coastguard Worker printf "%s,%s,%s\n" $testdir "$build" "no data" 159*288bf522SAndroid Build Coastguard Worker else 160*288bf522SAndroid Build Coastguard Worker printf "%-30s %-8s %12.12s\n" $testdir "$build" "no data" 161*288bf522SAndroid Build Coastguard Worker fi 162*288bf522SAndroid Build Coastguard Worker return 1 163*288bf522SAndroid Build Coastguard Worker fi 164*288bf522SAndroid Build Coastguard Worker 165*288bf522SAndroid Build Coastguard Worker set -- $($POWERAVE $hz $voltage $powerfile) 166*288bf522SAndroid Build Coastguard Worker current=$(echo $1 $baselineCurrent | awk '{ printf "%.2f", $1-$2; }') 167*288bf522SAndroid Build Coastguard Worker power=$(echo $2 $baselinePower | awk '{ printf "%.2f", $1-$2; }') 168*288bf522SAndroid Build Coastguard Worker 169*288bf522SAndroid Build Coastguard Worker case $workload in 170*288bf522SAndroid Build Coastguard Worker (idle) 171*288bf522SAndroid Build Coastguard Worker set -- 0 0 0 172*288bf522SAndroid Build Coastguard Worker ;; 173*288bf522SAndroid Build Coastguard Worker (suntemple) 174*288bf522SAndroid Build Coastguard Worker # units are fps 175*288bf522SAndroid Build Coastguard Worker set -- $(grep "FPS average" $file | sed 's/^.*seconds for a //' | awk '{ print $1; }' | average) 176*288bf522SAndroid Build Coastguard Worker ;; 177*288bf522SAndroid Build Coastguard Worker (recentfling|youtube|chrome) 178*288bf522SAndroid Build Coastguard Worker # units are ms, so need to convert to app/ms 179*288bf522SAndroid Build Coastguard Worker set -- $(grep ^Frames: $file | tr "/" " " | awk '{ print $4; }' | average | awk '{ printf "%.3f %.3f %.3f\n", 1000/$3, 1000/$2, 1000/$1;}' ) 180*288bf522SAndroid Build Coastguard Worker ;; 181*288bf522SAndroid Build Coastguard Worker (sysapps) 182*288bf522SAndroid Build Coastguard Worker # units are ms, so need to convert to app/ms 183*288bf522SAndroid Build Coastguard Worker set -- $(cat $file | sysappOutputParser | average | awk '{ printf "%.3f %.3f %.3f\n", 1000/$3, 1000/$2, 1000/$1;}' ) 184*288bf522SAndroid Build Coastguard Worker ;; 185*288bf522SAndroid Build Coastguard Worker (shadowgrid2) 186*288bf522SAndroid Build Coastguard Worker # units are fps 187*288bf522SAndroid Build Coastguard Worker set -- $(cat $file | hwuiOutputParser | tr ',' ' ' | awk '{print $2;}' | average) 188*288bf522SAndroid Build Coastguard Worker ;; 189*288bf522SAndroid Build Coastguard Worker esac 190*288bf522SAndroid Build Coastguard Worker 191*288bf522SAndroid Build Coastguard Worker minperf=$1 192*288bf522SAndroid Build Coastguard Worker aveperf=$2 193*288bf522SAndroid Build Coastguard Worker maxperf=$3 194*288bf522SAndroid Build Coastguard Worker perfPerWatt=$(echo $aveperf $power | awk '{ if ($2) { val=$1*1000/$2; printf "%.3f\n", val; } else print "unknown"; }') 195*288bf522SAndroid Build Coastguard Worker if [ "$format" = csv ]; then 196*288bf522SAndroid Build Coastguard Worker printf "%s,%s,%f,%f,%f,%f,%f,%f," $testdir "$build" $minperf $aveperf $maxperf $current $baselinePower $power 197*288bf522SAndroid Build Coastguard Worker printf "%s\n" $perfPerWatt 198*288bf522SAndroid Build Coastguard Worker else 199*288bf522SAndroid Build Coastguard Worker printf "%-30s %-8s %12.2f %12.2f %12.2f %12.2f %12.2f %12.2f " $testdir "$build" $minperf $aveperf $maxperf $current $baselinePower $power 200*288bf522SAndroid Build Coastguard Worker printf "%12s\n" $perfPerWatt 201*288bf522SAndroid Build Coastguard Worker fi 202*288bf522SAndroid Build Coastguard Worker} 203*288bf522SAndroid Build Coastguard Worker 204*288bf522SAndroid Build Coastguard Workerfunction calcBaselinePower { 205*288bf522SAndroid Build Coastguard Worker workload=$1 206*288bf522SAndroid Build Coastguard Worker defaultPowerFile="idle-display-power.out" 207*288bf522SAndroid Build Coastguard Worker powerFile=$defaultPowerFile 208*288bf522SAndroid Build Coastguard Worker case $workload in 209*288bf522SAndroid Build Coastguard Worker (shadowgrid2|suntemple|recentfling) 210*288bf522SAndroid Build Coastguard Worker powerFile="idle-airplane-display-power.out" 211*288bf522SAndroid Build Coastguard Worker if [ ! -f $powerFile ]; then 212*288bf522SAndroid Build Coastguard Worker powerFile=$defaultPowerFile 213*288bf522SAndroid Build Coastguard Worker fi;; 214*288bf522SAndroid Build Coastguard Worker esac 215*288bf522SAndroid Build Coastguard Worker if [ -f $powerFile ]; then 216*288bf522SAndroid Build Coastguard Worker $POWERAVE 5 4.3 $powerFile 217*288bf522SAndroid Build Coastguard Worker fi 218*288bf522SAndroid Build Coastguard Worker} 219*288bf522SAndroid Build Coastguard Worker 220*288bf522SAndroid Build Coastguard Workerfor t in $(cat tests) 221*288bf522SAndroid Build Coastguard Workerdo 222*288bf522SAndroid Build Coastguard Worker echo .======================= $t ================================ 223*288bf522SAndroid Build Coastguard Worker printHeader $t 224*288bf522SAndroid Build Coastguard Worker for i in $testResults 225*288bf522SAndroid Build Coastguard Worker do 226*288bf522SAndroid Build Coastguard Worker cd $i 227*288bf522SAndroid Build Coastguard Worker baseline="$(calcBaselinePower $t)" 228*288bf522SAndroid Build Coastguard Worker if [ "$baseline" != "" ]; then 229*288bf522SAndroid Build Coastguard Worker calcPerfData $i $t $baseline 230*288bf522SAndroid Build Coastguard Worker else 231*288bf522SAndroid Build Coastguard Worker echo "$i : no baseline current" 232*288bf522SAndroid Build Coastguard Worker fi 233*288bf522SAndroid Build Coastguard Worker cd - > /dev/null 234*288bf522SAndroid Build Coastguard Worker done 235*288bf522SAndroid Build Coastguard Workerdone 236