Manim cost-model calibration evidence¶
This file preserves the measurements used to shape DESIGN.md. They are calibration evidence for one machine and one evolving Manim fork, not universal wall-time constants for lint diagnostics.
Snapshot¶
- Captured: 2026-07-17 (Asia/Tokyo)
- Base commit:
4d25c031ffe7 - Manim version:
0.20.1 - OS: WSL2, Linux
6.6.87.2-microsoft-standard-WSL2, x86-64 - CPU: Intel Core Ultra 7 255H, 16 online logical CPUs
- System Python: CPython 3.12.3
- OpenGL probe used by the source audit: EGL / d3d12, Intel Arc Pro 140T
- Source manifest SHA-256:
a107ef99c811dcc681e353171b97d5ecaf3ddebb520a71554c16b28d5f14d294
The source manifest was computed with:
{ find manim -type f -not -path '*/__pycache__/*' -print0; printf '%s\0' pyproject.toml; } \
| sort -z | xargs -0 sha256sum | sha256sum
The worktree contained substantial uncommitted renderer changes. The source digest, not the base commit alone, identifies this calibration snapshot.
Measurements retained by the cost model¶
| Stage / workload | Observed measurement | Model implication |
|---|---|---|
| Cairo Transform, 300 members, 60 frames | interpolation 130.658 → 33.004 ms/play; steady 2.0761 → 0.1890 ms/frame with packed path |
retain frames × family × channels even when a gated fast path exists |
| updater-free recursive family | 1,000 nodes 0.1396 → 0.0327 ms/frame; 3,000 nodes 0.3665 → 0.0335 ms/frame with sealed elision |
an empty recursive walk is still frames × family |
| Transform begin, 500 members, matching topology | about 11.436 ms; copy was 64.6% |
model copy separately from interpolation |
| Transform begin, 1→16 curve mismatch | about 64.466 ms; alignment was 81.5% |
topology / curve-count delta is an independent dimension |
| Text, 1,000 characters | vectorized glyph closure saved about 20.9 ms end to end |
Text construction is not a trivial object allocation |
| 16 distinct cold MathTex expressions | sequential 120.724 s; submit-all/collect 11.717 s |
distinct cold resource keys and external processes must be modeled |
| 7 cold Graph labels | 24.662 → 4.760 s with local-fork precompile |
precompile advice requires multiple distinct keys and the local capability |
Cairo Surface (32, 32), 1,024 faces |
pre-optimization z-sort about 17 ms/frame; projection about 6.4 ms/frame; optimized 1080p capture still about 113.6 ms/frame in the recorded probe |
use faces × frames, camera motion, shading, stroke and pixels; MLP213 starts its advisory face gate at this recorded workload |
| fork-per-play Cairo, 1080p | Bayes 7.55 → 3.95 s; Algorithm 12.13 → 7.50 s in the recorded A/B |
fork blockers belong in a local-profile cost report, not generic warnings |
Additional end-to-end runs later in the same audit measured different absolute totals as more optimizations and cache states changed. The linter must therefore keep symbolic multiplicities as its primary result and never embed these milliseconds as portable truth.
Provenance¶
The source audit documents at capture time had these hashes:
906ee610d197261c878a7c8701558e22a10ac0282366f1365045348a585f56d2 .tmp_perf_audit_execution_log.md
cb90c84e221bed02446aaf2b1ccaeead057859990353c9c2dc7ad359a1307912 .tmp_perf_audit_candidates.md
e3f8e69a3f33b5c92870eb75160aaa6f6fdd3beb70d07f437dc7696e2a950edf .tmp_perf_audit_deep_dive.md
The detailed A/B protocols, correctness hashes, cache conditions and reproducer names were recorded there. If a future implementation imports coefficients from benchmark output, it must store the raw result, command, source digest, renderer, resolution, FPS, cache state and machine profile in a versioned calibration JSON rather than referring to a temporary file.