chore(tools): measure bench CPU time from schedstat
- commit
- 6d0032ffa888061d058b322a36154a5d7c810f58
- author
- brice · · 2026-10-13 16:06 UTC
- parent
- 99ddc5d
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
1 file · +6 -6
M tools/bench/bench.sh +6 -6
| @@ -58,20 +58,20 @@ pids+=("$!") | |||
| 58 | 58 | sleep 8 | |
| 59 | 59 | ||
| 60 | 60 | cs() { cat /proc/"$nwl"/task/*/status | awk '/^voluntary_ctxt/{v+=$2} END{print v}'; } | |
| 61 | - | ticks() { awk '{print $14+$15}' /proc/"$nwl"/stat; } | |
| 61 | + | # CPU time in ns summed over threads (schedstat is finer than stat's ticks). | |
| 62 | + | ticks() { cat /proc/"$nwl"/task/*/schedstat | awk '{v+=$1} END{printf "%d\n", v}'; } | |
| 62 | 63 | frames() { grep -c '"message":"frame"' "$log" || true; } | |
| 63 | 64 | ||
| 64 | 65 | t0=$(ticks); f0=$(frames); c0=$(cs) | |
| 65 | 66 | sleep "$secs" | |
| 66 | 67 | t1=$(ticks); f1=$(frames); c1=$(cs) | |
| 67 | 68 | ||
| 68 | - | hz=$(getconf CLK_TCK) | |
| 69 | - | python3 - "$((t1 - t0))" "$((f1 - f0))" "$((c1 - c0))" "$secs" "$hz" "$page" <<'EOF' | |
| 69 | + | python3 - "$((t1 - t0))" "$((f1 - f0))" "$((c1 - c0))" "$secs" "$page" <<'EOF' | |
| 70 | 70 | import sys | |
| 71 | - | t, f, c, s, hz, page = int(sys.argv[1]), int(sys.argv[2]), int(sys.argv[3]), float(sys.argv[4]), int(sys.argv[5]), sys.argv[6] | |
| 72 | - | cpu = t / hz / s * 100 | |
| 71 | + | t, f, c, s, page = int(sys.argv[1]), int(sys.argv[2]), int(sys.argv[3]), float(sys.argv[4]), sys.argv[5] | |
| 72 | + | cpu = t / 1e9 / s * 100 | |
| 73 | 73 | fr = max(f, 1) | |
| 74 | - | print(f"{page} cpu%={cpu:.2f} fps={f / s:.1f} ms/frame={t / hz * 1000 / fr:.3f} cs/frame={c / fr:.0f}") | |
| 74 | + | print(f"{page} cpu%={cpu:.2f} fps={f / s:.1f} ms/frame={t / 1e6 / fr:.3f} cs/frame={c / fr:.0f}") | |
| 75 | 75 | EOF | |
| 76 | 76 | ||
| 77 | 77 | if [ -n "${BENCH_KEEP:-}" ]; then | |
| @@ -58,20 +58,20 @@ pids+=("$!") | |||||
| 58 | sleep 8 | 58 | sleep 8 | ||
| 59 | 59 | ||||
| 60 | cs() { cat /proc/"$nwl"/task/*/status | awk '/^voluntary_ctxt/{v+=$2} END{print v}'; } | 60 | cs() { cat /proc/"$nwl"/task/*/status | awk '/^voluntary_ctxt/{v+=$2} END{print v}'; } | ||
| 61 | - | ticks() { awk '{print $14+$15}' /proc/"$nwl"/stat; } | 61 | + | # CPU time in ns summed over threads (schedstat is finer than stat's ticks). |
| 62 | + | ticks() { cat /proc/"$nwl"/task/*/schedstat | awk '{v+=$1} END{printf "%d\n", v}'; } | |||
| 62 | frames() { grep -c '"message":"frame"' "$log" || true; } | 63 | frames() { grep -c '"message":"frame"' "$log" || true; } | ||
| 63 | 64 | ||||
| 64 | t0=$(ticks); f0=$(frames); c0=$(cs) | 65 | t0=$(ticks); f0=$(frames); c0=$(cs) | ||
| 65 | sleep "$secs" | 66 | sleep "$secs" | ||
| 66 | t1=$(ticks); f1=$(frames); c1=$(cs) | 67 | t1=$(ticks); f1=$(frames); c1=$(cs) | ||
| 67 | 68 | ||||
| 68 | - | hz=$(getconf CLK_TCK) | 69 | + | python3 - "$((t1 - t0))" "$((f1 - f0))" "$((c1 - c0))" "$secs" "$page" <<'EOF' |
| 69 | - | python3 - "$((t1 - t0))" "$((f1 - f0))" "$((c1 - c0))" "$secs" "$hz" "$page" <<'EOF' | |||
| 70 | import sys | 70 | import sys | ||
| 71 | - | t, f, c, s, hz, page = int(sys.argv[1]), int(sys.argv[2]), int(sys.argv[3]), float(sys.argv[4]), int(sys.argv[5]), sys.argv[6] | 71 | + | t, f, c, s, page = int(sys.argv[1]), int(sys.argv[2]), int(sys.argv[3]), float(sys.argv[4]), sys.argv[5] |
| 72 | - | cpu = t / hz / s * 100 | 72 | + | cpu = t / 1e9 / s * 100 |
| 73 | fr = max(f, 1) | 73 | fr = max(f, 1) | ||
| 74 | - | print(f"{page} cpu%={cpu:.2f} fps={f / s:.1f} ms/frame={t / hz * 1000 / fr:.3f} cs/frame={c / fr:.0f}") | 74 | + | print(f"{page} cpu%={cpu:.2f} fps={f / s:.1f} ms/frame={t / 1e6 / fr:.3f} cs/frame={c / fr:.0f}") |
| 75 | EOF | 75 | EOF | ||
| 76 | 76 | ||||
| 77 | if [ -n "${BENCH_KEEP:-}" ]; then | 77 | if [ -n "${BENCH_KEEP:-}" ]; then | ||