aboutsummaryrefslogtreecommitdiff
path: root/bench.sh
blob: 049b03559cca5ccd1f3e772bb57c858c5b32a042 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/bash
set -euo pipefail

BIN=".build/release/pixel-sort"
INPUT="examples/input-1920x1080.png"
OUTPUT="/tmp/pixel-sort-bench-output.png"
ITERS="${1:-100}"

echo "Binary:     $BIN"
echo "Input:      $INPUT"
echo "Iterations: $ITERS"
echo ""

# Warmup
"$BIN" "$INPUT" "$OUTPUT" >/dev/null 2>&1

times=()
for i in $(seq 1 "$ITERS"); do
    t=$( { /usr/bin/time -p "$BIN" "$INPUT" "$OUTPUT" ; } 2>&1 | awk '/^real/ {print $2}')
    times+=("$t")
done

# Sort and compute stats
sorted=($(printf '%s\n' "${times[@]}" | sort -n))
n=${#sorted[@]}
min=${sorted[0]}
max=${sorted[$((n-1))]}
median=${sorted[$((n/2))]}
p95=${sorted[$(( (n * 95) / 100 ))]}
p99=${sorted[$(( (n * 99) / 100 ))]}

sum=$(printf '%s\n' "${times[@]}" | awk '{s+=$1} END {print s}')
mean=$(echo "$sum $n" | awk '{printf "%.4f", $1/$2}')

echo "=== Results (1920x1080, ${ITERS} runs) ==="
echo "  Min:    ${min}s"
echo "  Mean:   ${mean}s"
echo "  Median: ${median}s"
echo "  P95:    ${p95}s"
echo "  P99:    ${p99}s"
echo "  Max:    ${max}s"
echo ""
echo "  Target: ≤0.002s (2ms) P95"

p95_ms=$(echo "$p95" | awk '{printf "%.1f", $1 * 1000}')
pass=$(echo "$p95" | awk '{print ($1 <= 0.002) ? "PASS" : "FAIL"}')
echo "  P95 = ${p95_ms}ms → ${pass}"

rm -f "$OUTPUT"