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.

701k rows / second Scenario A, 1M rows
20 MiB peak RAM vs Meltano 819 MiB
~80× 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
701,000 rows/s
Meltano (Singer)
8,700 rows/s
Peak memory lower is better
faucet-stream
20 MiB
Meltano (Singer)
819 MiB
All three scenarios

The gap shrinks as the work moves from parse-bound to sink-bound.

Quote the ~80× 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 ~10×.

ScenarioBottleneckfaucet (rows/s)MeltanoThroughput gapPeak RAM (faucet vs Meltano)Memory gap
A — CSV → JSONL parse / serialize (best case) 700,574 8,698 ~80× 20.1 vs 818.8 MiB ~40×
B — Postgres → JSONL typed row decode 191,124 7,931 ~24× 21.7 vs 621.0 MiB ~29×
C — Postgres → Postgres destination write (sink-bound) 117,147 (copy) 12,186 ~10× 33.8 vs 690.3 MiB ~20×
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
make bench-build

# 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