# print summary of output generated by pwrtest.sh # # default results directories are <device>-<date>[-experiment]. By default # match any device and the year 201*. # # Examples: # # - show output for all bullhead tests in july 2015: # ./pwrsummary.sh -r "bh-201507*" # # - generate CSV file for import into spreadsheet: # ./pwrsummary.sh -o csv # CMDDIR=$(dirname $0 2>/dev/null) CMDDIR=${CMDDIR:=.} cd $CMDDIR CMDDIR=$(pwd) cd - POWERAVE="python $CMDDIR/powerave.py" defaultPattern="*-201*" defaultVoltage=4.3 defaultFrequency=5 function Usage { echo "$0 [-o format] [-v voltage] [-h freq] [-f resultsDirectories]" } while [ $# -gt 0 ] do case "$1" in (-o) format=$2; shift;; (-v) voltage=$2; shift;; (-h) hz=$2; shift;; (-r) testResults="$2"; shift;; (--help) Usage; exit 0;; (--) shift; break;; (*) echo Unknown option: $1 Usage exit 1;; esac shift done testResults=${testResults:=$defaultPattern} voltage=${voltage:=$defaultVoltage} hz=${hz:=$defaultFrequency} function printHeader { workload=$1 units="unknown" case $workload in (suntemple|shadowgrid2) units="FPS";; (recentfling|youtube|chrome) units="FPS from app point of view: 1/(90th percentile render time)";; (sysapps) units="App start/switch per second";; esac echo "Performance unit for $workload is: $units" if [ "$format" = csv ]; then 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 else 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 fi } function average { awk 'BEGIN { count=0; sum=0; max=-1000000000; min=1000000000; } { cur = $1; sum = sum + cur; if (cur > max) max = cur; if (cur < min) min = cur; count++; } END { if (count > 0) { ave = sum / count; printf "%.2f %.2f %.2f\n", min, ave, max; } }' } function hwuiOutputParser { # Stats since: 60659316905953ns # Total frames rendered: 150 # Janky frames: 89 (59.33%) # 90th percentile: 23ms # 95th percentile: 27ms # 99th percentile: 32ms # Number Missed Vsync: 0 # Number High input latency: 0 # Number Slow UI thread: 0 # Number Slow bitmap uploads: 12 # Number Slow draw: 89 # use with "stdbuf -o0 " to disable pipe buffering # stdbuf -o0 adb shell /data/local/tmp/hwuimacro shadowgrid2 400 | stdbuf -o0 ./hwuitestfilter.sh | tee t.csv sed -e 's/ns//' -e 's/[\(\)%]/ /g' | awk ' BEGIN { startTime=0; lastTime=0; } /^Stats since:/ { curTime = $3; if (startTime == 0) { startTime = curTime; } if (lastTime) { interval = curTime - lastTime; fps = totalFrames*1000000000 / interval; diffTime = curTime - startTime; printf "%.2f, %.2f, ",diffTime/1000000, fps; } } /^Total frames/ { totalFrames=$4; } /^Janky frames:/ { if (lastTime) { printf "%.2f\n",$4; lastTime=curTime; } lastTime = curTime; }' } function sysappOutputParser { awk ' BEGIN { fmt=0; count=0; sum=0; } /^App/ { if (count != 0) { if (fmt > 2) printf "Ave: %0.2fms\n", sum/count; else printf " %0.2f\n", sum/count; count = 0; sum = 0; } } /^[a-z]/ { val=$2; if (val != 0) { count++; sum+=val; } } /^Iteration/ { if (fmt > 2) printf "%s : ", $0; else if (fmt) printf "%d ", $2; } ' } function calcPerfData { testdir=$1 workload=$2 baselineCurrent=$3 baselinePower=$4 file=${workload}.out powerfile=${workload}-power.out build="$(cat build 2>/dev/null)" build=${build:="Unknown"} lines=$(wc -l $file 2>/dev/null | cut -f1 -d\ ) if [ ${lines:=0} -eq -0 ]; then # No performance data captured if [ "$format" = csv ]; then printf "%s,%s,%s\n" $testdir "$build" "no data" else printf "%-30s %-8s %12.12s\n" $testdir "$build" "no data" fi return 1 fi set -- $($POWERAVE $hz $voltage $powerfile) current=$(echo $1 $baselineCurrent | awk '{ printf "%.2f", $1-$2; }') power=$(echo $2 $baselinePower | awk '{ printf "%.2f", $1-$2; }') case $workload in (idle) set -- 0 0 0 ;; (suntemple) # units are fps set -- $(grep "FPS average" $file | sed 's/^.*seconds for a //' | awk '{ print $1; }' | average) ;; (recentfling|youtube|chrome) # units are ms, so need to convert to app/ms set -- $(grep ^Frames: $file | tr "/" " " | awk '{ print $4; }' | average | awk '{ printf "%.3f %.3f %.3f\n", 1000/$3, 1000/$2, 1000/$1;}' ) ;; (sysapps) # units are ms, so need to convert to app/ms set -- $(cat $file | sysappOutputParser | average | awk '{ printf "%.3f %.3f %.3f\n", 1000/$3, 1000/$2, 1000/$1;}' ) ;; (shadowgrid2) # units are fps set -- $(cat $file | hwuiOutputParser | tr ',' ' ' | awk '{print $2;}' | average) ;; esac minperf=$1 aveperf=$2 maxperf=$3 perfPerWatt=$(echo $aveperf $power | awk '{ if ($2) { val=$1*1000/$2; printf "%.3f\n", val; } else print "unknown"; }') if [ "$format" = csv ]; then printf "%s,%s,%f,%f,%f,%f,%f,%f," $testdir "$build" $minperf $aveperf $maxperf $current $baselinePower $power printf "%s\n" $perfPerWatt else printf "%-30s %-8s %12.2f %12.2f %12.2f %12.2f %12.2f %12.2f " $testdir "$build" $minperf $aveperf $maxperf $current $baselinePower $power printf "%12s\n" $perfPerWatt fi } function calcBaselinePower { workload=$1 defaultPowerFile="idle-display-power.out" powerFile=$defaultPowerFile case $workload in (shadowgrid2|suntemple|recentfling) powerFile="idle-airplane-display-power.out" if [ ! -f $powerFile ]; then powerFile=$defaultPowerFile fi;; esac if [ -f $powerFile ]; then $POWERAVE 5 4.3 $powerFile fi } for t in $(cat tests) do echo .======================= $t ================================ printHeader $t for i in $testResults do cd $i baseline="$(calcBaselinePower $t)" if [ "$baseline" != "" ]; then calcPerfData $i $t $baseline else echo "$i : no baseline current" fi cd - > /dev/null done done