From b2087ba800937e357a94ff7491cefae15e5198ef Mon Sep 17 00:00:00 2001 From: cos Date: Tue, 1 Dec 2020 22:36:49 +0100 Subject: Add code to measure time and memory consumption --- bin/measure_mem.sh | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++ bin/measure_time.sh | 40 +++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100755 bin/measure_mem.sh create mode 100755 bin/measure_time.sh (limited to 'bin') diff --git a/bin/measure_mem.sh b/bin/measure_mem.sh new file mode 100755 index 0000000..9839815 --- /dev/null +++ b/bin/measure_mem.sh @@ -0,0 +1,64 @@ +#!/bin/sh -e + +YEAR="${YEAR:-$(date +%Y)}" +DAY="${DAY:-$(TZ=EST date '+%d')}" +IMPL="${IMPL:-rust}" +PARTS="${AOC_PARTS:-1 2}" + +ITERS="${ITERS:-10}" +MODE="${MODE:-valgrind}" + +cd "${YEAR}/${IMPL}/day${DAY}" +case "${IMPL}" in + 'rust') + cargo build --release + EXECUTABLE="../target/release/day${DAY}" + ;; + *) + echo "Unknown implementation: ${IMPL}" >&2 + exit + ;; +esac + +# https://stackoverflow.com/q/774556/peak-memory-usage-of-a--process +for PART in $(echo ${PARTS}) +do + export AOC_PARTS="${PART}" + + OUT="memmax-${YEAR}-${IMPL}-${DAY}-${PART}.txt" + case "${MODE}" in + 'valgrind') + valgrind --tool=massif --pages-as-heap=yes \ + --massif-out-file=massif.out \ + "${EXECUTABLE}" "${@}" + grep mem_heap_B massif.out | \ + sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1 \ + >"${OUT}" + MEM=$(cat "${OUT}") + printf "${YEAR}-${IMPL}-${DAY}-${PART}: MEM: ${MEM} %dk %dM\n" \ + $(( MEM / 1024 )) $(( MEM / 1024 / 1024 )) + ;; + 'time') + # %X The average amount in (shared) text space used in kilobytes. + # %D The average amount in (unshared) data/stack space used in kilobytes. + # %K The total space used (%X+%D) in kilobytes. + # %M The maximum memory the process had in use at any time in kilobytes. + export TIMEFMT='%M' + for I in $(seq "${ITERS}"); do + zsh -c time "${EXECUTABLE}" "${@}" 2>&1 >/dev/null | tail -1 + done >"${OUT}" + + ALL_MEMORY_USAGES="$(cat "${OUT}" )" + NO_OF_ITERS=$(echo "${ALL_MEMORY_USAGES}" | wc -l) + ARITHM="$(echo "( ${ALL_MEMORY_USAGES}" | tr '\n' '+'; \ + echo "0 ) / ${NO_OF_ITERS}" )" + MEAN_MEMORY=$(( $(echo ${ARITHM}) )) + + echo "${YEAR}-${IMPL}-${DAY}-${PART}: Mean: ${MEAN_MEMORY}kB" + echo "${YEAR}-${IMPL}-${DAY}-${PART}: Mean: ${MEAN_MEMORY}kB" >>"${OUT}" + ;; + *) + echo "Unkown mode ${MODE}" >&2 + ;; + esac +done diff --git a/bin/measure_time.sh b/bin/measure_time.sh new file mode 100755 index 0000000..d308b19 --- /dev/null +++ b/bin/measure_time.sh @@ -0,0 +1,40 @@ +#!/bin/sh -e + +YEAR="${YEAR:-$(date +%Y)}" +DAY="${DAY:-$(TZ=EST date '+%d')}" +IMPL="${IMPL:-rust}" +PARTS="${AOC_PARTS:-1 2}" + +ITERS="${ITERS:-10}" + +cd "${YEAR}/${IMPL}/day${DAY}" +case "${IMPL}" in + 'rust') + cargo build --release + EXECUTABLE="../target/release/day${DAY}" + ;; + *) + echo "Unknown implementation: ${IMPL}" >&2 + exit + ;; +esac + +for PART in $(echo ${PARTS}) +do + export AOC_PARTS="${PART}" + OUT="time-${YEAR}-${IMPL}-${DAY}-${PART}.txt" + + export TIMEFMT='%uE' + for I in $(seq "${ITERS}"); do + zsh -c time "${EXECUTABLE}" "${@}" 2>&1 >/dev/null | tail -1 + done >"${OUT}" + + ALL_TIMINGS="$(cat "${OUT}" | sed 's/us/ + /' )" + NO_OF_ITERS=$(echo "${ALL_TIMINGS}" | wc -l) + ARITHM="$(echo "( ${ALL_TIMINGS}" | tr -d '\n'; \ + echo "0 ) / ${NO_OF_ITERS}" )" + MEAN_TIMING=$(( $(echo ${ARITHM}) )) + + printf "${YEAR}-${IMPL}-${DAY}-${PART}: Mean: ${MEAN_TIMING}µs\n" + printf "${YEAR}-${IMPL}-${DAY}-${PART}: Mean: ${MEAN_TIMING}µs\n" >>"${OUT}" +done -- cgit v1.2.3