Skip to content

Benchmarks

End-to-end job throughput measured in two phases: starting job chains (chains/s) and processing them to completion (jobs/s). Each adapter combination runs in a separate child process for isolation (Node.js v22, 10,000 jobs, concurrency 10, Apple M1 Pro).

StateNotifyStart (chains/s)Process (jobs/s)End-to-end (jobs/s)
PostgreSQLin-process~473~433~226
PostgreSQLPostgreSQL~428~436~216
SQLitein-process~10,262~733~684
SQLiteRedis~3,193~557~474
SQLiteNATS~8,277~723~665

See processing-capacity for the full benchmark tool.

Heap overhead of each Queuert component, measured in isolation with --expose-gc and forced GC before/after each step (Node.js v22, Apple M1 Pro). “Driver” is the database/messaging client connection; “Adapter” is the Queuert layer including schema migrations; “Client + Worker” is the Queuert client and in-process worker setup.

State AdapterDriverAdapter + MigrationsClient + Worker
PostgreSQL~183 KB~281 KB~123 KB
SQLite~78 KB~45 KB~141 KB
Notify AdapterDriverAdapterClient + Worker
Redis~430 KB~11 KB~150 KB
PostgreSQL~180 KB~11 KB~261 KB
NATS~184 KB~10 KB~144 KB
ComponentHeap OverheadNotes
Observability (OTel)~140 KBAdapter only; OTel MeterProvider adds ~21 KB
Dashboard~2 KBFirst API request loads ~1.7 MB of assets

See memory-footprint for the full measurement tool.

Queuert’s type-level machinery scales linearly across chain topologies (prebuilt .d.mts, Node.js v22, Apple M1 Pro):

ScenarioTypesTimeInstantiationsScaling
Linear: 1 type1~501ms15,7351.0x
Linear: 10 types10~560ms26,5041.7x
Linear: 50 types50~734ms64,6644.1x
Linear: 100 types100~949ms112,3647.1x
Branched: 4w x 3d85~931ms89,8935.7x
Branched: 2w x 6d127~1,111ms129,9818.3x
Blockers: 8 steps30~644ms46,9273.0x
Blockers: 25 steps98~927ms143,7599.1x
Loop: 20 steps21~639ms39,7302.5x
Loop: 50 steps51~807ms72,4604.6x
Merge: 2 x 50100~924ms116,2357.4x
Merge: 5 x 50250~1,439ms256,49616.3x
Merge: 10 x 50500~2,202ms490,65731.2x
Merge: 20 x 501,000~3,780ms958,77560.9x
Merge: 50 x 502,500~8,941ms2,370,507150.7x
ConfigurationStatus
Up to 100 types in a single linear chainOK, <1s (tsc)
Branched chains up to 2w x 6d (~127 types)OK, ~1.1s (tsc)
Blockers: up to 25 steps, 3 blockers eachOK, <1s (tsc)
Loops: up to 50 self-referencing stepsOK, <1s (tsc)
Merging 10 slices of 50 types (500 total)OK, ~2.2s (tsc)
Merging 50 slices of 50 types (2500 total)OK, ~8.9s (tsc)

See type-complexity for the full benchmark tool and detailed results.