Benchmarks

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.

712k rows / second Scenario A, 1M rows
11.8 MiB peak RAM vs Meltano 724 MiB
~96× faster (best case) CSV → JSONL
1:1 row parity 1,000,000 = 1,000,000
Scenario A · CSV → JSONL · 1M rows

The best case, in two pictures.

Throughput higher is better
faucet-stream
712,000 rows/s
Meltano (Singer)
7,400 rows/s
Peak memory lower is better
faucet-stream
11.8 MiB
Meltano (Singer)
724 MiB
All three scenarios

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×.

ScenarioBottleneckfaucet (rows/s)MeltanoThroughput gapPeak 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×
Run it yourself

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.
Full methodology & caveats →
# 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/.

Get started

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