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