Skip to content

Benchmarks (vs Meltano)

Honest, reproducible evidence for the “built for throughput” claim. Every number below comes from BENCHMARKS.md — identical workloads, one machine (Apple M3 Pro, 12 cores, 18 GiB RAM), 1M rows, seed 42, median of 5 timed runs. faucet-stream is compared against Meltano (the most common Singer runtime).

~80×
faster on CSV → JSONL (best case, parse-bound)
~10×
faster on a realistic DB → DB move (sink-bound)
~40×
less peak memory (20 vs 819 MiB)
1:1
exact row-count parity, every scenario
faucet-stream Meltano (Singer)
Throughput — rows/second (higher is better)
1,000,000 rows. Meltano's bar is a sliver on purpose — that is the result.
A — CSV → JSONL · parse-bound (best case)
faucet
700,574
Meltano
8,698
B — Postgres → JSONL · typed row decode
faucet
191,124
Meltano
7,931
C — Postgres → Postgres · sink-bound (the realistic move)
faucet (COPY)
117,147
Meltano
12,186
Peak memory — MiB (lower is better)
Here faucet is the sliver: bounded-memory streaming holds flat while Meltano buffers.
A — CSV → JSONL
faucet
20.1
Meltano
818.8
B — Postgres → JSONL
faucet
21.7
Meltano
621.0
C — Postgres → Postgres
faucet
33.8
Meltano
690.3
The gap collapses as the workload gets more I/O-bound
Speed-up multiplier (faucet ÷ Meltano). The best case is not the typical case.
A · parse-bound
~80×
B · row decode
~24×
C · sink-bound
~10×
Show the raw numbers as a table
Scenario Bottleneck faucet (rows/s) Meltano (rows/s) Gap faucet RSS (MiB) Meltano RSS (MiB)
A — CSV → JSONL parse/serialize (best case) 700,574 8,698 ~80× 20.1 818.8
B — Postgres → JSONL typed row decode 191,124 7,931 ~24× 21.7 621.0
C — Postgres → Postgres destination write (sink-bound) 117,147 (COPY) 12,186 ~10× 33.8 690.3

All runs: 1,000,000 rows, seed 42, exact row-count parity (1,000,000 = 1,000,000). Measured 2026-10-16 against Meltano 4.4.1; earlier runs are in the History section of BENCHMARKS.md.

The harness never fabricates a number — a tool that won’t install/run is recorded as such, not faked. Regenerate everything on your own hardware:

Terminal window
make bench # Scenario A (CSV → JSONL, 1M rows) — no infra
make bench-smoke # 100k-row smoke run
make bench-postgres # adds Scenarios B & C (needs Docker)

Results land in benchmarks/results/. One independent confirmation on your own hardware is worth more to this project than a new connector — open an issue or PR with your output, especially if faucet does not win. See benchmarks/README.md and Performance tuning for the levers behind these numbers.