mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-10-24 17:56:50 -06:00
Every lookup by id walked the whole tree, and the edit path did one per selected id, so editing a selection of n objects cost O(n²). Measured with the new `perf --deep` rows at 25,000 paths: - Select All: 458 → 3.5 ms - nudge the selection: 3,517 → 34 ms - drag it with the Selection tool, per pointer move: 3,413 → 35 ms - undo / redo: 407 → 3.1 ms - vectorcraft_doc: Document::index_paths (every id's index path, in one walk; the first in tree order for a duplicated id, as index_path), node_at, node_mut_at (copy-on-write, as node_mut) and ancestry_at. - apply_transform, roots_of, transform_patterns, doc_sane, Selection::prune and Document::paint_order look their ids up with one walk instead of one each. - Selection::set dedups with a hash set instead of Vec::contains per id. - vectorcraft-cli perf --deep: tracked rows for editing a whole selection (select, nudge, drag, undo, redo), live effects, every Pathfinder operation, typing in a long story, and memory. tests_lookups checks the batched lookups against the one-id ones on nested trees with missing and duplicated ids; storing the last duplicate instead of the first fails it. The doc and engine suites (2,000 tests) pass unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VmMmc1J8XeNLxhRihWv9cc