Skip to main content

Performance

Speed and footprint are why the TypeScript Prisma AIRS CLI was rewritten in Rust. Every run of the TypeScript CLI first starts Node.js, then loads and compiles its JavaScript and 65 production packages, before it reads its first argument. airs is one native executable with no runtime: it starts in about 6 ms.

Speed​

airs 8.0.0 against the TypeScript CLI 7.3.0, measured on 2026-10-23 on an Apple M5 Pro. Each figure is the median of 30 runs against a loopback fixture server, so it measures the CLI's own work: process start, argument parsing, tenant loading, the HTTP client, JSON and output.

Workloadairs 8.0.0TypeScript 7.3.0Faster
Start-up (airs --version)6.3 ms80.6 ms13x
Local commands (--help, tenant list, tenant read)8.7–8.9 ms82.4–85.9 ms9.3–9.9x
One API call (a scan, one profiles page)17.5–17.7 ms96.8–98.9 ms5.5–5.6x
doctor18.5 ms117 ms6.3x
Paging 2,000 profiles or topics (--all)29.8–44.4 ms118–130 ms2.9–4.0x
50 scans in a row0.85 s4.91 s5.8x

With Node's compile cache (NODE_COMPILE_CACHE) the TypeScript CLI is 10–12 ms faster per run, and airs is still 2.7–11x faster.

Resources​

Per commandairs 8.0.0TypeScript 7.3.0Less
CPU time (user + system)3.5–34 ms95–207 ms6.1–27x
Peak memory (RSS)6.5–72 MiB106–174 MiB2.0–16x

Footprint​

airs 8.0.0TypeScript 7.3.0
Programone executable0.88 MiB of JavaScript in 5 files
RuntimenoneNode.js (the node binary is 116 MiB)
Dependenciescompiled in65 npm packages
Installed on disk (macOS arm64)31.1 MiB219.6 MiB (103 MiB in 3,104 files, plus Node.js)

The executables of 8.0.0:

PlatformBinaryRelease tarball
macOS arm64 (signed and notarised)31.07 MiB12.96 MiB
Linux x86_64 (static musl)38.65 MiB14.49 MiB
Linux arm64 (static musl)30.63 MiB13.33 MiB

The Linux builds are fully static; the macOS build links only system libraries. The npm channel installs the same binary as a platform package (13.4–14.6 MiB) behind an 8 KiB launcher, which is the only part that needs Node.js.

How the executable grew​

The binary grew with each command group ported from the TypeScript CLI:

ReleaseAddedmacOS binary
0.1.0tenants, doctor, profile and topic reads, scans (10 commands)9.63 MiB
0.5.0tenant and runtime writes, bulk scanning (0.3–0.5)11.25 MiB
0.6.0Red Team15.79 MiB
0.7.0DLP17.94 MiB
0.8.0Model Security19.52 MiB
0.9.0runtime extras, the HTML reports21.39 MiB
0.10.0AI Gateway30.47 MiB
0.11.0Supplychain30.82 MiB
8.0.0TypeScript 7.3.0's directional profiles (277 commands)31.07 MiB

The growth has a cost: against 0.1.0, a parsed command takes about 2.5 ms longer and an API command about 4 ms longer. Every factor above already includes it.

On a real tenant​

A management read on a real tenant spends 0.7–0.8 s waiting for the service, so the 80 ms that airs saves per command appears there as a constant, not a multiple (1.0–1.2x in the read-only live runs). The factors apply in full to local commands, to scripts and agents that run the CLI many times, and to the CPU and memory a host spends on each run.

Method and raw data​

The benchmark, its method, the environment, the per-run spread, the caveats and the live results are in docs/BENCHMARKS.md. To reproduce it from a checkout:

scripts/build-reference-cli.sh --verify
cargo build --release
cargo run --release -p airs-test-harness --example bench -- --ts-compile-cache --name loopback