Local lab results — 5 October 2026
Measured on an Apple M1 laptop, macOS (Darwin 25.5.0 arm64), Chromium 153.0.8010.12, with a 4× CPU slowdown. Desktop used 1440 × 1000 and mobile emulation used 390 × 844. Each fixture ran three times. The mobile profile is emulation on the same laptop, not a physical phone. Timings include automated file selection and waiting for complete node statistics; they are not pure parse times or field INP.
Long main-thread tasks remain: observed maximums across runs ranged from 200 to 1,774 ms, including test instrumentation. The worker does not eliminate transfer, rendering, or browser memory costs. These results describe these fixtures and this environment only; they do not establish unlimited file capacity or superiority over another viewer.
How the viewer handles large data
Above 200,000 characters, parsing and search run in a Web Worker. The editor initially displays only the first 20,000 characters to avoid laying out megabytes of text. The full document remains available for viewing, search, copying, and formatting. Long sibling lists render in windows; deeply nested views stop at 100 levels.
What to measure
- 01
Generate the deterministic fixtures with npm run fixtures. Each has a known shape and node count.
- 02
Build the production site, then start npm run serve. Measure production rather than the Vite development server.
- 03
Run npm run benchmark. The runner loads each fixture three times in desktop and mobile viewport profiles using 4× CPU throttling.
- 04
Compare the median file-to-statistics time, every individual run, and the longest observed main-thread task. Record browser, OS, CPU, fixture bytes, and the commit.
- 05
Repeat on physical desktop and mobile devices before making broad speed or capacity claims. Emulation does not reproduce device memory, thermals, or network conditions.
Important limits
- Synthetic file-to-statistics timing is not a field Core Web Vital or a maximum supported file size.
- Workers still transfer parsed values to the main thread. Large object graphs use memory in both contexts.
- Search returns at most 200 match paths while reporting the full match count. Expand all can still render substantial work.
- Edit full document opts back into the complete textarea, which can require expensive layout.
- Numbers follow JavaScript number semantics. Converters and formatting should not be used to preserve exact unsafe integers.
Reproduce instead of assuming
npm ci
npm run fixtures
npm run build
npm run serve
# In another terminal:
npm run benchmark