summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
authorcos <cos>2020-12-01 22:36:49 +0100
committercos <cos>2020-12-01 23:47:05 +0100
commitb2087ba800937e357a94ff7491cefae15e5198ef (patch)
treef5e5e6f38f0f211341d9d94a7234921ec2d0e5a5 /bin
parentf44158d941198d175c26ef8f74e80e4d4d0fa7a2 (diff)
downloadadventofcode-b2087ba800937e357a94ff7491cefae15e5198ef.zip
Add code to measure time and memory consumption
Diffstat (limited to 'bin')
-rwxr-xr-xbin/measure_mem.sh64
-rwxr-xr-xbin/measure_time.sh40
2 files changed, 104 insertions, 0 deletions
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