layout: doc title: “Go benchmarks: SQL and RESP” description: Local pgx and RESP2 results on Apple M3 Max, with PostgreSQL CPU, memory and connection scaling. section: Benchmarks permalink: /docs/benchmarks-go.html

last_modified_at: “2026-09-15”

Go benchmarks: SQL and RESP

Overview · Node.js · Go and RESP

Go 1.27.1 with pgx 5.11.0 and a standard-library RESP2 client; GOMAXPROCS=8. Machine and measurement method.

Measured on 15 September 2026 with extension build f03ed22. The Go client runs inside the Linux VM, in a separate container sharing PostgreSQL’s network namespace. Client CPU and memory are excluded from server resource counters. RESP uses eight workers, a 1 GiB cache/buffer budget and a 512-client limit.

Median requests/s, three five-second samples per case:

Keys/request Connections Prepared SQL SQL mget RESP MGET
1 64 277,088 211,251 722,133
1 256 253,790 186,296 839,678
64 64 26,459 38,122 38,877
64 256 27,615 43,647 52,774

64-key SQL varied from 19–28k requests/s across server restarts despite identical data, settings and index plans. The table uses the faster repeated run; the cause of the variation remains unresolved. All 129 samples include both runs, exact source revisions, binary hashes and query plans.

Read-only cache samples had 100% hits and no errors or connection-limit rejections. The harness checks SQL and RESP connection headroom. A separate 256-connection, 64-key probe with 12 Go threads did not improve RESP; SQL mget gained 6% over eight threads.

Server resources

At 256 connections, medians across the same samples:

Keys/request Path Client CPU cores Server CPU cores (% of VM) Server µs/request Sampled peak MiB
1 SQL 3.97 8.94 (63.9%) 36.3 679.8
1 SQL mget 3.36 9.93 (70.9%) 54.4 684.2
1 RESP MGET 5.98 6.11 (43.7%) 7.8 263.7
64 SQL 3.72 9.45 (67.5%) 348.3 689.8
64 SQL mget 5.12 4.99 (35.6%) 116.0 707.7
64 RESP MGET 5.76 4.97 (35.5%) 95.8 266.7

Go client on macOS

Through Docker’s published ports, at 64 connections; medians of three five-second samples, in requests/s:

Keys/request, 64 connections Prepared SQL SQL mget RESP MGET
1 49,194 48,010 52,426
64 14,324 15,751 16,240

The VM and host cases differ in both client OS and network route. The host-port results therefore cannot isolate PostgreSQL’s throughput limit. RESP also has a different session contract: workers use a configured database role and do not inherit a caller’s SQL transaction or snapshot. See the RESP reference.

Reproduce

Run the Go benchmark

From the repository root, with Docker, Node.js 20+ and Go 1.25+:

./examples/benchmark.sh go > go.json

The script builds a disposable PostgreSQL server and the Go client, runs each case three times, records server resources, then removes its containers. The client runs in the Docker VM, in a separate cgroup from PostgreSQL. Defaults: 64/256 connections, 1/64 keys and five seconds per sample.

Optional overrides: CONNECTIONS, BATCHES, REPEATS, DURATION_SECONDS and GOMAXPROCS. The JSON records the running extension’s build ID.