#!/bin/bash
set -e
set -o pipefail
prefix_with() (
local PREFIX=("$@")
while read line
do
echo "${PREFIX[@]}" "$line"
done
)
progress() (
local EXPECTED_LINES=$1
local I=0
echo "0/$EXPECTED_LINES (0%)" >&2
while read line
do
echo "$line"
I="$[$I + 1]"
echo "$I/$EXPECTED_LINES ($[100 * $I / $EXPECTED_LINES]%)" >&2
done
)
print_stats() (
local TOTAL=0
local N=0
for VALUE in "$@"
do
TOTAL="$(echo $TOTAL + $VALUE | bc -l)"
N="$[$N + 1]"
done
if [[ $N == 0 ]]
then
echo "N/A ()"
else
echo "$(echo $TOTAL / $N | bc -l) ($@)"
fi
)
BASEDIR="$PWD"
COMPILERS=(g++ clang++)
# NUM_ITERATIONS = ITERATIONS_FACTOR/NUM_BINDINGS
ITERATIONS_FACTOR="$[400 * 1000 * 1000]"
# Must be multiples of 10
NUM_BINDINGS_FOR_RUNTIME_TESTS=(100 1000)
# Must be multiples of 5
NUM_BINDINGS_FOR_COMPILE_TESTS=(20 80 320)
NUM_LINES="$[${#COMPILERS[@]} * (${#NUM_BINDINGS_FOR_RUNTIME_TESTS[@]} * 3 + ${#NUM_BINDINGS_FOR_COMPILE_TESTS[@]})]"
# All result lines are of the form:
# <compiler> <n> <test> <avg. time> (<time>...)
for compiler in ${COMPILERS[@]}
do
rm -rf build
mkdir build
(
cd build
cmake .. -DCMAKE_CXX_COMPILER=$(which $compiler) -DCMAKE_BUILD_TYPE=Release &>/dev/null
(
cd examples/benchmark
for N in ${NUM_BINDINGS_FOR_RUNTIME_TESTS[@]}
do
(
NUM_ITERATIONS="$[$ITERATIONS_FACTOR / $N]"
sed -i "s/num_components_with_no_deps = .*/num_components_with_no_deps = $[$N / 10];/" $BASEDIR/examples/benchmark/generate_benchmark.cpp
sed -i "s/num_components_with_deps = .*/num_components_with_deps = $[9 * ($N / 10)];/" $BASEDIR/examples/benchmark/generate_benchmark.cpp
make benchmark &>/dev/null
SETUP_TIMES=()
REQUEST_TIMES=()
for i in $(seq 1 4)
do
RESULTS=($(echo $NUM_ITERATIONS | ./main $NUM_ITERATIONS | fgrep Total | awk '{print $5}'))
SETUP_TIMES+=("${RESULTS[0]}")
REQUEST_TIMES+=("${RESULTS[1]}")
done
print_stats "${SETUP_TIMES[@]}" | prefix_with "fruit_setup_time"
print_stats "${REQUEST_TIMES[@]}" | prefix_with "fruit_request_time"
sed -i "s/#define MULTIPLIER .*/#define MULTIPLIER $N/" $BASEDIR/examples/benchmark/new_delete_benchmark.cpp
make new_delete_benchmark &>/dev/null
NEW_DELETE_TIMES=()
for i in $(seq 1 4)
do
NEW_DELETE_TIMES+=($(echo $NUM_ITERATIONS | ./new_delete_benchmark | awk '{print $3}'))
done
print_stats "${NEW_DELETE_TIMES[@]}" | prefix_with "new_delete_time"
) | prefix_with $N
done
)
(
cd examples/compile_time_benchmark
for N in ${NUM_BINDINGS_FOR_COMPILE_TESTS[@]}
do
(
sed -i "s/#define MULTIPLIER .*/#define MULTIPLIER $[$N/5]/" $BASEDIR/examples/compile_time_benchmark/module.cpp
COMPILE_TIMES=()
for i in $(seq 1 4)
do
COMPILE_TIMES+=($(make compile_time_benchmark 2>&1 | fgrep real | awk '{print $2}' | tr -d s | sed 's/m/*60+/' | bc))
done
print_stats "${COMPILE_TIMES[@]}" | prefix_with "fruit_compile_time"
) | prefix_with "$[$N * 5]"
done
)
) | prefix_with $compiler
done | progress $NUM_LINES