xref: /aosp_15_r20/external/google-fruit/extras/scripts/run_benchs.sh (revision a65addddcf69f38db5b288d787b6b7571a57bb8f)
1*a65addddSAndroid Build Coastguard Worker#!/bin/bash
2*a65addddSAndroid Build Coastguard Worker
3*a65addddSAndroid Build Coastguard Workerset -e
4*a65addddSAndroid Build Coastguard Workerset -o pipefail
5*a65addddSAndroid Build Coastguard Worker
6*a65addddSAndroid Build Coastguard Workerprefix_with() (
7*a65addddSAndroid Build Coastguard Worker  local PREFIX=("$@")
8*a65addddSAndroid Build Coastguard Worker  while read line
9*a65addddSAndroid Build Coastguard Worker  do
10*a65addddSAndroid Build Coastguard Worker    echo "${PREFIX[@]}" "$line"
11*a65addddSAndroid Build Coastguard Worker  done
12*a65addddSAndroid Build Coastguard Worker)
13*a65addddSAndroid Build Coastguard Worker
14*a65addddSAndroid Build Coastguard Workerprogress() (
15*a65addddSAndroid Build Coastguard Worker  local EXPECTED_LINES=$1
16*a65addddSAndroid Build Coastguard Worker  local I=0
17*a65addddSAndroid Build Coastguard Worker  echo "0/$EXPECTED_LINES (0%)" >&2
18*a65addddSAndroid Build Coastguard Worker  while read line
19*a65addddSAndroid Build Coastguard Worker  do
20*a65addddSAndroid Build Coastguard Worker    echo "$line"
21*a65addddSAndroid Build Coastguard Worker    I="$[$I + 1]"
22*a65addddSAndroid Build Coastguard Worker    echo "$I/$EXPECTED_LINES ($[100 * $I / $EXPECTED_LINES]%)" >&2
23*a65addddSAndroid Build Coastguard Worker  done
24*a65addddSAndroid Build Coastguard Worker)
25*a65addddSAndroid Build Coastguard Worker
26*a65addddSAndroid Build Coastguard Workerprint_stats() (
27*a65addddSAndroid Build Coastguard Worker  local TOTAL=0
28*a65addddSAndroid Build Coastguard Worker  local N=0
29*a65addddSAndroid Build Coastguard Worker  for VALUE in "$@"
30*a65addddSAndroid Build Coastguard Worker  do
31*a65addddSAndroid Build Coastguard Worker    TOTAL="$(echo $TOTAL + $VALUE | bc -l)"
32*a65addddSAndroid Build Coastguard Worker    N="$[$N + 1]"
33*a65addddSAndroid Build Coastguard Worker  done
34*a65addddSAndroid Build Coastguard Worker  if [[ $N == 0 ]]
35*a65addddSAndroid Build Coastguard Worker  then
36*a65addddSAndroid Build Coastguard Worker    echo "N/A ()"
37*a65addddSAndroid Build Coastguard Worker  else
38*a65addddSAndroid Build Coastguard Worker    echo "$(echo $TOTAL / $N | bc -l) ($@)"
39*a65addddSAndroid Build Coastguard Worker  fi
40*a65addddSAndroid Build Coastguard Worker)
41*a65addddSAndroid Build Coastguard Worker
42*a65addddSAndroid Build Coastguard WorkerBASEDIR="$PWD"
43*a65addddSAndroid Build Coastguard WorkerCOMPILERS=(g++ clang++)
44*a65addddSAndroid Build Coastguard Worker# NUM_ITERATIONS = ITERATIONS_FACTOR/NUM_BINDINGS
45*a65addddSAndroid Build Coastguard WorkerITERATIONS_FACTOR="$[400 * 1000 * 1000]"
46*a65addddSAndroid Build Coastguard Worker# Must be multiples of 10
47*a65addddSAndroid Build Coastguard WorkerNUM_BINDINGS_FOR_RUNTIME_TESTS=(100 1000)
48*a65addddSAndroid Build Coastguard Worker# Must be multiples of 5
49*a65addddSAndroid Build Coastguard WorkerNUM_BINDINGS_FOR_COMPILE_TESTS=(20 80 320)
50*a65addddSAndroid Build Coastguard WorkerNUM_LINES="$[${#COMPILERS[@]} * (${#NUM_BINDINGS_FOR_RUNTIME_TESTS[@]} * 3 + ${#NUM_BINDINGS_FOR_COMPILE_TESTS[@]})]"
51*a65addddSAndroid Build Coastguard Worker
52*a65addddSAndroid Build Coastguard Worker# All result lines are of the form:
53*a65addddSAndroid Build Coastguard Worker# <compiler> <n> <test> <avg. time> (<time>...)
54*a65addddSAndroid Build Coastguard Workerfor compiler in ${COMPILERS[@]}
55*a65addddSAndroid Build Coastguard Workerdo
56*a65addddSAndroid Build Coastguard Worker  rm -rf build
57*a65addddSAndroid Build Coastguard Worker  mkdir build
58*a65addddSAndroid Build Coastguard Worker  (
59*a65addddSAndroid Build Coastguard Worker    cd build
60*a65addddSAndroid Build Coastguard Worker    cmake .. -DCMAKE_CXX_COMPILER=$(which $compiler) -DCMAKE_BUILD_TYPE=Release &>/dev/null
61*a65addddSAndroid Build Coastguard Worker    (
62*a65addddSAndroid Build Coastguard Worker      cd examples/benchmark
63*a65addddSAndroid Build Coastguard Worker      for N in ${NUM_BINDINGS_FOR_RUNTIME_TESTS[@]}
64*a65addddSAndroid Build Coastguard Worker      do
65*a65addddSAndroid Build Coastguard Worker        (
66*a65addddSAndroid Build Coastguard Worker          NUM_ITERATIONS="$[$ITERATIONS_FACTOR / $N]"
67*a65addddSAndroid Build Coastguard Worker          sed -i "s/num_components_with_no_deps = .*/num_components_with_no_deps = $[$N / 10];/" $BASEDIR/examples/benchmark/generate_benchmark.cpp
68*a65addddSAndroid Build Coastguard Worker          sed -i "s/num_components_with_deps    = .*/num_components_with_deps    = $[9 * ($N / 10)];/" $BASEDIR/examples/benchmark/generate_benchmark.cpp
69*a65addddSAndroid Build Coastguard Worker          make benchmark &>/dev/null
70*a65addddSAndroid Build Coastguard Worker          SETUP_TIMES=()
71*a65addddSAndroid Build Coastguard Worker          REQUEST_TIMES=()
72*a65addddSAndroid Build Coastguard Worker          for i in $(seq 1 4)
73*a65addddSAndroid Build Coastguard Worker          do
74*a65addddSAndroid Build Coastguard Worker            RESULTS=($(echo $NUM_ITERATIONS | ./main $NUM_ITERATIONS | fgrep Total | awk '{print $5}'))
75*a65addddSAndroid Build Coastguard Worker            SETUP_TIMES+=("${RESULTS[0]}")
76*a65addddSAndroid Build Coastguard Worker            REQUEST_TIMES+=("${RESULTS[1]}")
77*a65addddSAndroid Build Coastguard Worker          done
78*a65addddSAndroid Build Coastguard Worker          print_stats "${SETUP_TIMES[@]}" | prefix_with "fruit_setup_time"
79*a65addddSAndroid Build Coastguard Worker          print_stats "${REQUEST_TIMES[@]}" | prefix_with "fruit_request_time"
80*a65addddSAndroid Build Coastguard Worker          sed -i "s/#define MULTIPLIER .*/#define MULTIPLIER $N/" $BASEDIR/examples/benchmark/new_delete_benchmark.cpp
81*a65addddSAndroid Build Coastguard Worker          make new_delete_benchmark &>/dev/null
82*a65addddSAndroid Build Coastguard Worker          NEW_DELETE_TIMES=()
83*a65addddSAndroid Build Coastguard Worker          for i in $(seq 1 4)
84*a65addddSAndroid Build Coastguard Worker          do
85*a65addddSAndroid Build Coastguard Worker            NEW_DELETE_TIMES+=($(echo $NUM_ITERATIONS | ./new_delete_benchmark | awk '{print $3}'))
86*a65addddSAndroid Build Coastguard Worker          done
87*a65addddSAndroid Build Coastguard Worker          print_stats "${NEW_DELETE_TIMES[@]}" | prefix_with "new_delete_time"
88*a65addddSAndroid Build Coastguard Worker        ) | prefix_with $N
89*a65addddSAndroid Build Coastguard Worker      done
90*a65addddSAndroid Build Coastguard Worker    )
91*a65addddSAndroid Build Coastguard Worker    (
92*a65addddSAndroid Build Coastguard Worker      cd examples/compile_time_benchmark
93*a65addddSAndroid Build Coastguard Worker      for N in ${NUM_BINDINGS_FOR_COMPILE_TESTS[@]}
94*a65addddSAndroid Build Coastguard Worker      do
95*a65addddSAndroid Build Coastguard Worker        (
96*a65addddSAndroid Build Coastguard Worker          sed -i "s/#define MULTIPLIER .*/#define MULTIPLIER $[$N/5]/" $BASEDIR/examples/compile_time_benchmark/module.cpp
97*a65addddSAndroid Build Coastguard Worker          COMPILE_TIMES=()
98*a65addddSAndroid Build Coastguard Worker          for i in $(seq 1 4)
99*a65addddSAndroid Build Coastguard Worker          do
100*a65addddSAndroid Build Coastguard Worker            COMPILE_TIMES+=($(make compile_time_benchmark 2>&1 | fgrep real | awk '{print $2}' | tr -d s | sed 's/m/*60+/' | bc))
101*a65addddSAndroid Build Coastguard Worker          done
102*a65addddSAndroid Build Coastguard Worker          print_stats "${COMPILE_TIMES[@]}" | prefix_with "fruit_compile_time"
103*a65addddSAndroid Build Coastguard Worker        ) | prefix_with "$[$N * 5]"
104*a65addddSAndroid Build Coastguard Worker      done
105*a65addddSAndroid Build Coastguard Worker    )
106*a65addddSAndroid Build Coastguard Worker  ) | prefix_with $compiler
107*a65addddSAndroid Build Coastguard Workerdone | progress $NUM_LINES
108