#!/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