- KnotVector::basis_eval_into: N_BasisEval into a caller buffer (same
values, same errors); basis_eval wraps it
- srf_nurb::Surface::eval (N_SrfEvalPt) and crv_nurb::Curve::eval
(N_CrvEval) keep N on the stack, as upstream; one malloc/free less per
basis per point evaluation
- test: basis_eval_into equals basis_eval bit for bit, errors included
- scripts/perf/samply_top.py: self/inclusive/callee/allocator tables and a
Rust/C++ split from samply profiles (no GUI)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H9QwJFBTKLZ9FFK3nVd1X4
- UnitResult.timing (not in the report): wall time of case building,
run_cpp, run_rust, compare and the slowest Rust case; main prints
`TIME <unit> ...` to stderr per unit
- DIFFTEST_RUST_DIGEST=<dir>: writes <dir>/<unit>.digest with one
`<case>\t<fnv1a64 of format!("{rust_output:?}")>` line per case, so two
builds can be proved bit-identical; off by default
- README: --green takes ~35 min on 16 threads (not ~2 min), TIME line,
digest, and scripts/perf (ptrace sampler + analyzer, no sudo needed)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H9QwJFBTKLZ9FFK3nVd1X4