xref: /aosp_15_r20/system/extras/tests/workloads/pwrsummary.sh (revision 288bf5226967eb3dac5cce6c939ccc2a7f2b4fe5)
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