Fast — and reproducible.
Identical workloads, one machine, faucet-stream vs Meltano (the common Singer runtime). The harness never fabricates a number — a tool that won't run is recorded as such. Run it yourself in one command.
The best case, in two pictures.
The gap shrinks as the work moves from parse-bound to sink-bound.
Quote the ~96× CSV figure as the upper bound, not the typical case. When the database write dominates, both tools hit the same wall and the gap narrows to ~16×.
| Scenario | Bottleneck | faucet (rows/s) | Meltano | Throughput gap | Peak RAM (faucet vs Meltano) | Memory gap |
|---|---|---|---|---|---|---|
| A — CSV → JSONL | parse / serialize (best case) | 712,000 | 7,400 | ~96× | 11.8 vs 724 MiB | ~62× |
| B — Postgres → JSONL | typed row decode | 179,700 | 7,184 | ~25× | 13.9 vs 743 MiB | ~53× |
| C — Postgres → Postgres | destination write (sink-bound) | 123,200 (copy) / 99,000 (insert) | 7,706 | ~16× / ~13× | 35.9 vs 485.7 MiB | ~13.5× |
One independent confirmation beats a new connector.
The harness lives in benchmarks/. It generates a
seeded dataset (byte-identical for both tools), times with hyperfine
(1 warmup + 5 runs, median ± stddev), samples peak RSS, and enforces row-count
parity. Results land in benchmarks/results/.
- Scenario A needs no infra — just the CLI.
- B & C add Docker Postgres.
- Reported run: Apple M3 Pro, 12 cores, 18 GiB, macOS.
# build the release binary the harness uses
cargo build -p faucet-cli --release \
--no-default-features \
--features "source-csv,sink-jsonl,source-postgres,sink-postgres"
# Scenario A — 1,000,000 rows (no infra)
make bench
# Scenarios B & C — add Docker Postgres
make bench-postgres
# quick 100k smoke run
make bench-smoke
# → benchmarks/results/ — results.md, versions.txt, raw JSON Read before quoting. This measures single-machine batch throughput of specific
moves — not distributed throughput, connector breadth, or correctness. Sink- and
API-bound moves narrow the gap further. Found a case where faucet doesn't win?
Open an issue or PR with your benchmarks/results/.
Your first pipeline runs in five minutes.
Install the CLI, scaffold a config, and move real data — nothing external to stand up.
curl -LsSf https://github.com/faucet-hq/faucet-stream/releases/latest/download/faucet-cli-installer.sh | sh brew install faucet-hq/faucet-stream/faucet-cli