Skip to Content
Benchmarks

Benchmarks

Vooya FS chooses native implementations from equivalent, reproducible workloads. The current evidence covers all 26 public operation families, with a full comparison table for each API, both Node 22 and Node 24, synchronous and Promise forms, small inputs and larger workloads. Slower cases and Node execution routes remain visible.

Published results

EvidenceCoverageResults
All API comparisons26 APIs; 136 workload/mode cases per runtime; Node, Vooya, fs-extra, graceful-fs and applicable specialized peersPer-API tables
Upstream competitor workloadsPinned typescript-eslint source tree, tiny and wide trees; fdir/tinyglobby upstream workloads; glob/readdirFull tables and methodology
Readdir concurrencySame real repository, default versus 1/2/4/8 workers, alongside Node and fdirConcurrency diagnostic
Native optimization evidenceGrouped glob traversal and Buffer write/append overhead before and after the optimizationNative overhead evidence
Fused scan crossoverSmall and medium traversal with metadataBatch evidence

The per-API page links to its detailed comparison table. Raw JSON downloads appear on each evidence page and include every sample, runtime/library versions, fixture options, CPU/memory observations and source/native-binary identity. Evidence is a snapshot of the recorded revision and configuration, not a universal speed claim.

Find an API table

Open the table for the operation you use. On narrow screens, swipe horizontally inside a table to reach the remaining implementations; the times are milliseconds for a complete workload, and lower is better. Keep the runtime, mode, options and execution route matched when comparing rows.

Reproduce the complete matrix

From a fresh checkout, install the locked dependencies and build the release binding once. Install Node 22.22.0 and Node 24.21.0 with your version manager for an exact-runtime reproduction; supply the absolute paths to their executables.

pnpm install --frozen-lockfile pnpm build pnpm test:competitor-contract # Inspect the six jobs without downloading fixtures or writing reports. pnpm perf:matrix --node22 /absolute/path/to/node22 \ --node24 /absolute/path/to/node24 \ --output .perf/reproduction-2026-10-01 --dry-run # Run the same jobs sequentially on this machine. pnpm perf:matrix --node22 /absolute/path/to/node22 \ --node24 /absolute/path/to/node24 \ --output .perf/reproduction-2026-10-01

The script validates both runtime versions, prepares the pinned upstream source archive if necessary (requires curl and tar), and verifies its fixture manifest. It runs all-API comparisons, upstream comparisons and the readdir concurrency sweep, first on Node 22 and then Node 24. It does not install or execute code from the fixture. Existing mismatched fixtures are rejected. Existing report files are not overwritten; use a new output directory for each experiment.

Use --fixture /path/to/pinned/typescript-eslint to reuse an extraction, or --suites all-apis to run only the synthetic full-API matrix without downloading the upstream fixture. Defaults are two warmups and ten samples per implementation. Do not run builds, tests or competing benchmarks during measurement.

Focused follow-ups

# Current Node runtime; all APIs or selected APIs. pnpm perf:all-apis --output .perf/all-apis.json pnpm perf:all-apis --apis readFile,cp,rm --output .perf/focused.json # Existing pinned source fixture. pnpm perf:competitors --fixture .perf/competitors/typescript-eslint \ --output .perf/competitors.json pnpm perf:readdir-concurrency .perf/competitors/typescript-eslint \ .perf/readdir-concurrency.json # Older scale-oriented suite; useful for larger synthetic scan workloads. pnpm perf:fs scan --iterations 10 --warmup 2 --json .perf/scan.json

For the all-API runner, --smoke --samples 2 --warmups 1 is a reduced debugging run, not publishable performance evidence. The older perf:fs suite defaults to medium scale; --large and --extreme are explicitly requested stress workloads.

Publish reviewed tables

Generate tables from the completed reports into review files first:

pnpm docs:all-api-evidence --input .perf/reproduction-2026-10-01 \ --output .perf/all-api-evidence.mdx pnpm docs:competitor-evidence --input .perf/reproduction-2026-10-01 \ --output .perf/competitor-evidence.mdx

The generator rejects incomplete/smoke reports, missing cases or samples, mismatched runtimes, library/source/binary identities and machine context. After reviewing correctness, distributions and losses, copy the reports into docs/public/evidence, then run both pnpm docs:all-api-evidence and pnpm docs:competitor-evidence. Review retained competitor findings against the new measurements, format the generated pages and run pnpm doc:build. Do not replace historical source hashes with newer ones: regenerate measurements, or retain the old report as a labeled baseline.

CI runs the benchmark adapter contracts on Node 22/24 across supported platforms, including output and mutation validation. It does not assert timing ratios on shared runners. Local macOS performance is not Windows/Linux performance evidence.

Interpret the numbers

  • Compare the same output, options, concurrency and side effects. fs-extra and graceful-fs often wrap Node; scan competitors are explicitly composed pipelines.
  • Sync cp and rm may execute through Node. Their timings are compatibility measurements, not Rust acceleration.
  • Fresh equivalent mutation state is prepared before every sample. Setup, GC, validation and cleanup are outside timing; API calls and result construction are included.
  • Filesystem caches are warm. Writes do not request fsync/flush; file copying may use clones. Logical throughput is not durable-storage or physical-disk bandwidth.
  • RSS/heap/external deltas are not peak memory. Negative deltas are not evidence of implementation-specific memory savings.
  • Retain raw samples, inspect p90 and repeat noisy comparisons. Tiny timings and small differences do not establish a stable winner.

See the full API adapter contract  and upstream provenance and licenses  for the exact shared subset and measurement limits.

Last updated on