3.9 KiB
Performance
Live parsing is debounced by 120 ms and live execution by 220 ms. Live runs use a 250 ms wall-clock limit; manual runs default to 2 seconds and can be raised to the configured 10-second maximum.
Tests exercise bounded parsing, execution, zero-length iteration, result truncation and worker recovery. Browser performance depends on hardware, browser, engine version, pattern and subject. The UI therefore reports observed elapsed time and exact runtime identity but makes no universal throughput or safety claim.
The production bundle separates syntax and execution workers. Interactive syntax/extraction trees and editor decoration sets render at most 2,000 items each and report both the rendered and actual totals. These are presentation limits only: normalized syntax, exact ranges and bounded engine results remain available to the capture table and eligible exports.
Replacement templates have a 64 Ki UTF-16 input limit. Every token below that limit remains in the syntax model; the editor decorates at most 2,000 tokens, the token list renders 500 rows, and at most 200 replacement diagnostics (including an omission summary) cross into the UI. List templates have a 16 Ki UTF-16 input limit and render 250 token chips.
The per-match replacement view renders at most 200 matches and 2,000 contributions, with a combined 50,000 token-evaluation budget. Original, replacement and individual contribution text are previewed separately from the bounded output.
Capture rows are collected under the central 100,000-row limit and rendered in pages of 200. Individual result-value previews are capped at 64 Ki UTF-16 units and share an 8 Mi-unit aggregate engine-result budget. The extraction tree shows 100 UTF-16 units per value and capture-table cells show 512, with explicit range lengths and separate engine-prefix labels; copy and eligible JSON export retain the bounded engine value. List export is disabled when a source value is incomplete, so a bounded preview cannot be mistaken for the full value. List generation additionally stops at 250,000 template-token evaluations, a 64 Ki UTF-16 row preview, or an 8 Mi-unit aggregate materialization bound. The UI shows 500 list rows while an eligible export still contains every generated row; any incomplete result disables export. Replacement output has a separate 64 MiB bound. Match/capture-limit incompleteness and output-byte truncation are tracked separately; either makes the aggregate replacement result incomplete.
Unit-test cases run through supervisors separate from the interactive workers.
Each case uses its configured timeout, cancellation kills the active worker,
and the suite has a 60-second aggregate wall limit. Suite state is capped at
1,000 cases; add, clone, current-result capture and JSON append-import all
enforce that cap and preflight a 32 MiB aggregate in-memory suite bound. Test
names, patterns, subjects, replacement templates and expected values have
explicit per-field limits; subjects must also fit the execution engine's UTF-8
byte cap. Failure diagnostics preview only bounded portions of expected and
actual values and retain at most 2 KiB UTF-8 per result, keeping 1,000 result
messages below the 2 MiB log budget. A complete replacement output above the
expected-value or aggregate-suite limit is not copied into draft state; a
lightweight should-match draft is offered when applicable.
Project import, export and local save have a 32 MiB aggregate UTF-8 JSON limit
in addition to field-specific limits. Standalone test-suite import has the same
32 MiB pre-parse file/document limit. Export and save count the indented JSON
representation against a byte budget before materializing or writing it.
IndexedDB schema version 2 indexes updatedAt; latest-project loading opens one
descending cursor and validates only that record instead of calling getAll().
Formal cold/warm benchmarks, p95 statistics and growth charts are deferred to the analysis milestone and will run in killable workers.