Benchmarks
Each number on this page is a measurement, read from the published results of a benchmark suite
(bench/results). Each table gives its date, its machine and its method.
- Who measured. We did, on our own hardware. These are not official leaderboard submissions. A result that projects onto a public board says so.
- Which build. The development build of the date in each table, unless the table names a release. We run each table again on every release.
- Machine. Each table names its machine. A shared host gives a noisy number: read a difference of less than 15% as equal.
- Measure it yourself. Install the toolchain. It carries the suites we use
and these results, so you need no source. Each table ends with its command:
giz bench run SUITEfor a whole suite,giz bench compare SUITE/ITEMfor one row beside our number, and--size quickfor a small input.giz bench listshows the suites on your machine. A row that a suite cannot measure by itself tells you why when you run it. A table of a suite that needs the GizStack sources says so. - Where a number comes from. A table marked as taken from our notes was measured before its suite existed. The suite has not recorded it again yet.
- What we do not show. Results on commercial databases whose licenses forbid publication.
Toolchain
| Gizlang | |
|---|---|
First giz main.giz (compiles, links and runs) | 0.72 s |
| Second run (from the cache) | 0.22 s |
giz test main.test.giz | 0.33 s |
The released toolchain on a clean user account. giz init hello, then in hello: the first giz main.giz (it compiles, links and runs, with an empty cache), the second (from the cache) and giz test main.test.giz.
A clean user account.
These numbers come from our measurement notes of that date. The suite has not recorded them again yet.
Measure it again with the toolchain: giz bench run tools/firstrun, or one row on a small input: giz bench compare tools/firstrun/first --size quick.
Web: a whole app against Next.js and Rust + React
Two identical apps, each written on GizWeb and on the comparison stack. The pages, actions, session token and data are the same.
| GizWeb | Next.js 16 | |
|---|---|---|
| Start-up to first page | 66 ms | 271 ms |
| Thread page, one CPU (Next.js: one process) | 1,739 req/s | 197 req/s |
| Thread page, 8 server CPUs | 2,398 req/s, a thread for each CPU | 197 req/s, one process |
| p50 latency, one CPU | 14.4 ms | 152 ms |
| p99 latency, one CPU | 58.5 ms | 562 ms |
| Thread page HTML | 60,154 B (3,438 B gzip) | 102,736 B (10,164 B gzip) |
| Page CSS | 15,013 B (4,777 B gzip) | 1,035 B (534 B gzip) |
| JavaScript sent to the browser | 26,157 B (9,448 B gzip) | 592,598 B (196,717 B gzip) |
| Memory after load (PSS) | 68.3 MB | 378 MB |
| App code (non-blank lines) | 506 (409 code) | 474 (453 code) |
| Edit: add a validated link field (changed lines) | 3 files, 13 lines | 4 files, 35 lines |
The same threaded realtime comments app on GizWeb and on Next.js 16 (App Router, server actions, node:sqlite): the same pages, actions and session token, and 60 seeded comments. Each server is one process on 8 server CPUs; the load (bench/web/lib/load.c, 32 keep-alive connections) is on 8 other CPUs. GizWeb runs on one server CPU, then on a thread for each server CPU, with GizDB in the process. Throughput is the best of 3 runs.
GizDB in the process (`Data.database`).
These numbers come from our measurement notes of that date. The suite has not recorded them again yet.
This suite needs the GizStack sources, so the release does not carry it yet.
| GizWeb | nextrs | |
|---|---|---|
Page /, 1 CPU | 60,762 req/s | 55,909 req/s |
| Page p50 latency, 1 CPU | 0.82 ms | 0.84 ms |
| Page p99 latency, 1 CPU | 0.94 ms | 1.78 ms |
| JSON API, 1 CPU | 111,446 req/s | 74,011 req/s |
| JSON API p50 latency, 1 CPU | 0.42 ms | 0.63 ms |
| JSON API p99 latency, 1 CPU | 0.59 ms | 1.14 ms |
| Memory after load, 1 CPU (PSS) | 5.1 MB | 12.8 MB |
Page /, 8 CPUs | 339,193 req/s | 277,735 req/s |
| Page p50 latency, 8 CPUs | 0.1 ms | 0.16 ms |
| Page p99 latency, 8 CPUs | 0.66 ms | 0.46 ms |
| JSON API, 8 CPUs | 608,451 req/s | 351,828 req/s |
| JSON API p50 latency, 8 CPUs | 0.06 ms | 0.13 ms |
| JSON API p99 latency, 8 CPUs | 0.29 ms | 0.47 ms |
| Memory after load, 8 CPUs (PSS) | 11.6 MB | 14.4 MB |
| Start-up to first page | 21 ms | 27 ms |
| Server binary | 1.4 MB | 6.1 MB |
| Page HTML | 4,427 B (1,983 B gzip) | 3,002 B (1,557 B gzip) |
| JavaScript sent to the browser (static imports) | 1,188 B (671 B gzip) | 300,083 B (100,800 B gzip) |
| App code (non-blank lines) | 221 (191 code) | 689 (549 code) |
The same todos app on GizWeb and in the examples/react-todos that nextrs measures itself with: the same three todos, page, detail page, filter, JSON API and live updates. Each server runs on one CPU, then on the 8 server CPUs (GizWeb with a thread for each CPU, the tokio of nextrs with a thread for each CPU). The load comes from 8 other CPUs, with 50 connections, on the two routes that the own benchmark of nextrs loads.
These numbers come from our measurement notes of that date. The suite has not recorded them again yet.
This suite needs the GizStack sources, so the release does not carry it yet.
HTTP server
| Gizlang | actix | Bun | dusty | |
|---|---|---|---|---|
| baseline | 302,589 req/s | 212,098 req/s | 269,761 req/s | 229,754 req/s |
| limited-conn | 258,147 req/s | 171,938 req/s | 220,013 req/s | 232,148 req/s |
| async | 151,459 req/s | 160,278 req/s | 179,585 req/s | 140,491 req/s |
| json-tls | 76,398 req/s | 53,955 req/s | 98,285 req/s | 21,331 req/s |
| json-comp-4096 | 30,152 req/s | 69,874 req/s | 59,020 req/s | 58,471 req/s |
| json-comp-16384 | 31,968 req/s | 66,052 req/s | 60,353 req/s | 53,113 req/s |
| latency-10k (CPU per request) | 34.6 µs | 33.3 µs | 70.9 µs | 37 µs |
| latency-1m (CPU per request) | 8.7 µs | 8.1 µs | 10.2 µs | 8.26 µs |
| latency-1m (p99) | 939 ms | 51 ms | 577 ms | 1,038 ms |
| 8gbit (CPU per request) | 49.5 µs | 33.4 µs | 60.1 µs | 114 µs |
| Rank on the composite of the board (estimate) | 4th of 95 | — | — | — |
| Composite score (estimate) | 6,337 | — | — | — |
The scored profiles of HttpArena with the load tools and arguments of the board, scaled to 8 server CPUs and 8 load CPUs (pinned rates / 8), best of 3 runs (latency profiles: 2). actix, Bun and dusty ran at the same time on the same CPUs. score.giz projects the result onto the composite of the board through the references measured at the same time. A latency profile shows the CPU time of each request at the fixed rate.
These numbers come from our measurement notes of that date. The suite has not recorded them again yet.
This suite needs the GizStack sources, so the release does not carry it yet.
| Gizlang | nginx | |
|---|---|---|
Plaintext GET /bench | 607,104 req/s | 647,664 req/s |
| Conditional GET (304) | 188,000 req/s | 189,000 req/s |
| Static file, 1 KiB | 50,000 req/s | 110,000 req/s |
| Static file, 64 KiB | 41,000 req/s | 66,000 req/s |
| Static file, 1 MiB | 5,600 req/s | 6,900 req/s |
| gzip of a 61 KB page | 1,100 req/s | 3,600 req/s |
| Reverse proxy | 174,383 req/s | 176,659 req/s |
| TLS 1.3 | 202,000 req/s | 193,000 req/s |
Each server gets one worker for each server CPU, with the same files, upstream and certificate. The load runs on 8 other CPUs (load.c, or wrk for TLS) with 256 connections; the proxy upstream is an nginx with two workers on two more CPUs. The value is the median rate of 3 rounds, with the server order turned in each round.
2 workers on 2 CPUs, a quiet machine. 4 workers on 4 cores, a shared machine (load average 4 to 26); run A.
These numbers come from our measurement notes of that date. The suite has not recorded them again yet.
This suite needs the GizStack sources, so the release does not carry it yet.
GizDB: analytics
GizDB is the one of the three that is also a transactional PostgreSQL-protocol server, a Redis server and an embedded engine. On hot runs of TPC-H SF10 and ClickBench (10M rows) it takes less time than DuckDB 1.5.6 over all queries (the geometric mean of the time ratios); some single queries are still slower, and each table lists them. The TPC-H SF1 table is an older measurement over the PostgreSQL protocol.
| GizDB | DuckDB | |
|---|---|---|
| ClickBench 10M: GizDB time over DuckDB time, geometric mean | 0.56 x | 1 x |
| Q0 | 0.2 ms | 0 ms |
| Q1 | 1.2 ms | 1 ms |
| Q2 | 1.9 ms | 2 ms |
| Q3 | 2.5 ms | 3 ms |
| Q4 | 12.5 ms | 46 ms |
| Q5 | 14.3 ms | 63 ms |
| Q6 | 0.2 ms | 0 ms |
| Q7 | 1.7 ms | 1 ms |
| Q8 | 45.7 ms | 54 ms |
| Q9 | 58.1 ms | 92 ms |
| Q10 | 7 ms | 12 ms |
| Q11 | 7.2 ms | 13 ms |
| Q12 | 15.1 ms | 46 ms |
| Q13 | 53 ms | 83 ms |
| Q14 | 37.3 ms | 50 ms |
| Q15 | 16.6 ms | 48 ms |
| Q16 | 114 ms | 100 ms |
| Q17 | 12.4 ms | 89 ms |
| Q18 | 203 ms | 158 ms |
| Q19 | 0.5 ms | 0 ms |
| Q20 | 19.5 ms | 50 ms |
| Q21 | 20 ms | 43 ms |
| Q22 | 41.3 ms | 86 ms |
| Q23 | 63.4 ms | 52 ms |
| Q24 | 1.3 ms | 6 ms |
| Q25 | 6 ms | 9 ms |
| Q26 | 1.2 ms | 6 ms |
| Q27 | 84.4 ms | 60 ms |
| Q28 | 1,312 ms | 1,379 ms |
| Q29 | 2.1 ms | 7 ms |
| Q30 | 44.4 ms | 42 ms |
| Q31 | 63.5 ms | 49 ms |
| Q32 | 418 ms | 300 ms |
| Q33 | 87.4 ms | 193 ms |
| Q34 | 90.9 ms | 209 ms |
| Q35 | 14.3 ms | 61 ms |
| Q36 | 4.2 ms | 24 ms |
| Q37 | 1.8 ms | 12 ms |
| Q38 | 3.1 ms | 11 ms |
| Q39 | 71.2 ms | 57 ms |
| Q40 | 2.5 ms | 3 ms |
| Q41 | 3.1 ms | 3 ms |
| Q42 | 3.8 ms | 9 ms |
10 million rows of ClickBench's hits, loaded once into a GizDB folder and a DuckDB 1.5.6 file. bench/db/engine/hot.giz runs each query of bench/db/clickbench/queries.sql 4 times in one session of each engine on the same 12 CPUs: one warm run, then the best of 3 (psql's \timing for GizDB over the PG protocol, DuckDB's .timer), in ms. Row counts must match. The geometric mean is of GizDB's time over DuckDB's, over the queries DuckDB takes 1 ms or more for.
29 of 40 queries at or below DuckDB's time. Measured alone at 0486c83b under other loads on the host (DuckDB 300 ms, 244 at 523f9210 on a quieter host).
This suite needs the GizStack sources, so the release does not carry it yet.
| GizDB | DuckDB | |
|---|---|---|
| TPC-H SF10: GizDB time over DuckDB time, geometric mean | 0.764 x | 1 x |
| Q1 | 134 ms | 176 ms |
| Q2 | 21.1 ms | 44 ms |
| Q3 | 99.3 ms | 119 ms |
| Q4 | 67.1 ms | 148 ms |
| Q5 | 146 ms | 124 ms |
| Q6 | 30.4 ms | 37 ms |
| Q7 | 97.9 ms | 101 ms |
| Q8 | 71.3 ms | 113 ms |
| Q9 | 641 ms | 530 ms |
| Q10 | 126 ms | 271 ms |
| Q11 | 30.9 ms | 20 ms |
| Q12 | 59.1 ms | 93 ms |
| Q13 | 373 ms | 456 ms |
| Q14 | 47 ms | 91 ms |
| Q15 | 76.5 ms | 69 ms |
| Q16 | 112 ms | 113 ms |
| Q17 | 60.6 ms | 107 ms |
| Q18 | 342 ms | 451 ms |
| Q19 | 64.2 ms | 208 ms |
| Q20 | 120 ms | 91 ms |
| Q21 | 321 ms | 420 ms |
| Q22 | 72.4 ms | 76 ms |
CALL dbgen(sf=10) (60 million lineitem rows), loaded once into a GizDB folder and a DuckDB 1.5.6 file. bench/db/engine/hot.giz runs each query of bench/db/tpch/queries.sql 4 times in one session of each engine on the same 12 CPUs: one warm run, then the best of 3 (psql's \timing for GizDB over the PG protocol, DuckDB's .timer), in ms. Row counts must match. The geometric mean is of GizDB's time over DuckDB's, over the queries DuckDB takes 1 ms or more for.
17 of 22 queries at or below DuckDB's time. A second pass 30 minutes later: 0.757, 17 of 22.
This suite needs the GizStack sources, so the release does not carry it yet.
| GizDB | PostgreSQL 16 | DuckDB | |
|---|---|---|---|
| All 22 queries | 0.449 s | more than 607 s (2 stopped) | 0.666 s |
| Q1 | 20 ms | 998 ms | 28 ms |
| Q2 | 5 ms | 151 ms | 12 ms |
| Q3 | 12 ms | 226 ms | 22 ms |
| Q4 | 8 ms | 117 ms | 19 ms |
| Q5 | 21 ms | 142 ms | 22 ms |
| Q6 | 4 ms | 203 ms | 7 ms |
| Q7 | 20 ms | 194 ms | 24 ms |
| Q8 | 10 ms | 185 ms | 17 ms |
| Q9 | 72 ms | 661 ms | 76 ms |
| Q10 | 36 ms | 432 ms | 40 ms |
| Q11 | 7 ms | 107 ms | 7 ms |
| Q12 | 8 ms | 281 ms | 16 ms |
| Q13 | 52 ms | 389 ms | 57 ms |
| Q14 | 6 ms | 223 ms | 19 ms |
| Q15 | 10 ms | 234 ms | 11 ms |
| Q16 | 41 ms | 185 ms | 63 ms |
| Q17 | 9 ms | stopped at 5 min | 15 ms |
| Q18 | 33 ms | 1,636 ms | 73 ms |
| Q19 | 9 ms | 252 ms | 34 ms |
| Q20 | 23 ms | stopped at 5 min | 19 ms |
| Q21 | 31 ms | 291 ms | 63 ms |
| Q22 | 12 ms | 98 ms | 22 ms |
Load lineitem by COPY | 8.57 s | 15.6 s | — |
Load orders by COPY | 2.08 s | 3.45 s | — |
CALL dbgen(sf=1) (6 million lineitem rows), loaded into GizDB and PostgreSQL by psql's \copy and analyzed. Each query runs once, then 5 more times; the value is the median of those, in ms. GizDB and PostgreSQL are timed at the client over the PG protocol, DuckDB by its own timer. A query stops at 5 minutes. Every answer must equal DuckDB's.
Servers and DuckDB on 8 benchmark CPUs (6-9, 18-21), the runner on 4 others. DuckDB 1.5.6, PostgreSQL 16.15.
This suite needs the GizStack sources, so the release does not carry it yet.
| GizDB | DuckDB | |
|---|---|---|
Q1: sum(a) over a date range | 5 ms | 7 ms |
| Q2: group by 100 keys | 20 ms | 21 ms |
| Q3: group by 100k keys, top 3 | 106 ms | 127 ms |
| Q4: join and group | 35 ms | 19 ms |
Q5: count(DISTINCT c) | 45 ms | 94 ms |
| Q6: top-N | 6 ms | 9 ms |
f(id PK, c, a, d, s) with 10 million rows from generate_series (c 100k values, a 1000, d 365 days, s 100 texts) and dim(id PK, r) with 100k rows. Each query runs once, then 5 more times; the value is the median of those, in ms. Every answer must equal DuckDB's.
Both engines on 8 benchmark CPUs (6-9, 18-21), the runner on 4 others. DuckDB 1.5.6.
Measure it again with the toolchain: giz bench run db/olap, or one row on a small input: giz bench compare db/olap/Q1 --size quick.
GizDB: transactions and durability
| GizDB | PostgreSQL 16 | |
|---|---|---|
| TPC-B, 1 client | 244 tps | 265 tps |
| TPC-B, 16 clients | 2,143 tps | 1,008 tps |
pgbench -i over COPY | 0.7 s | 1.2 s |
pgbench -i -s 10 (1 million accounts), then the built-in TPC-B script with -M prepared for 8 s. GizDB runs with --threads 8; fsync is on in both, so every commit waits for its sync. The load step is timed alone: pgbench -i -s 10 -q (CREATE, COPY of 1 million accounts from the client, VACUUM, primary keys).
Servers on 8 benchmark CPUs (6-9, 18-21), pgbench on 4 others (10, 11, 22, 23). PostgreSQL 16.15.
Measure it again with the toolchain: giz bench run db/pgbench, or one row on a small input: giz bench compare db/pgbench/tpcb1 --size quick.
| GizDB | |
|---|---|
| Acknowledged transactions whole after the kills | 17,846 acknowledged, all whole after 1,000 kills |
Each loop starts the server on the same folder, runs 4 connections that commit 3-row transactions (and in one loop of 7 a CHECKPOINT), kills the server with SIGKILL after 5 to 150 ms, restarts it and checks the loop's rows: an acknowledged transaction must be there whole, one in flight whole or absent, and nothing else. One loss fails the run.
1,000 kills; 4,000 transactions in flight at the kills, each whole or absent; 56,625 rows checked.
This suite needs the GizStack sources, so the release does not carry it yet.
GizDB: Redis protocol
| GizDB | Redis 7.4 | |
|---|---|---|
| SET, synced every second | 61,482 req/s | 99,950 req/s |
| SET pipelined 16, synced every second | 159,744 req/s | 399,202 req/s |
| GET, synced every second | 66,622 req/s | 114,220 req/s |
| SET, synced before each answer | 11,570 req/s | 6,093 req/s |
| SET, no persistence | 79,968 req/s | 114,286 req/s |
| Server CPU for each SET | 15.2 µs | 9.1 µs |
| Memory after the run (PSS) | 216 MB | 20.5 MB |
| Restart with 100k keys | 109 ms | 231 ms |
One server on one CPU, redis-benchmark on other CPUs: 50 connections, 200,000 requests, 64-byte values, data on disk. Each mode gives the same guarantee on both servers: no persistence (GizDB still writes its log and never syncs it), a sync every second, or a sync before each answer. Server CPU counts the plain SETs.
1 shard on 1 CPU (6), 1 I/O thread each; Redis 7.4.1. Load from 8 other benchmark CPUs.
This suite needs the GizStack sources, so the release does not carry it yet.
Live updates
| Gizlang | |
|---|---|
| An app of 800 lines: edit to one function body (p50) | 53 ms |
| 12,500 lines: edit to one function body (p50) | 108 ms |
| 100,000 lines: edit to one function body (p50) | 436 ms |
run.giz writes a generated web app, starts giz live on it and edits a literal in a handler body 20 times. Each edit is timed from the save of the file (a rename, as an editor saves) to the line on the app's stdout that shows the response of the new code. The value is the p50.
Load average 9 to 23.
These numbers come from our measurement notes of that date. The suite has not recorded them again yet.
This suite needs the GizStack sources, so the release does not carry it yet.
| Gizlang | |
|---|---|
| Deploy to the change in an open page, in production | 1.86–1.96 s |
Five deployments of a changed title to a page that was already open, timed from Deploy to the change in the page. The text and focus in a form field stayed. Measured by hand.
Five deployments.
These numbers come from our measurement notes of that date. The suite has not recorded them again yet.
This suite needs the GizStack sources, so the release does not carry it yet.
Language
| Gizlang | Rust | C | |
|---|---|---|---|
| Runtime score | 90.7 | 90.6 | 90.2 |
LangArena: 50 realistic programs, written safe and idiomatic in each language. Each test alternated with Rust on the same machine, then the formula of the board was applied against its runs of 2026-10-05.
Against the runs of the board of 2026-10-05.
These numbers come from our measurement notes of that date. The suite has not recorded them again yet.
Measure it again with the toolchain: giz bench run compiler/langarena, or one row on a small input: giz bench compare compiler/langarena/score --size quick.
| Gizlang | Go 1.22 | |
|---|---|---|
| 1,000,000 switches between 100 hot tasks | 18 ms | 73 ms |
| Memory for each task, at 100,000 tasks | 4.4 KB | 2.5 KB |
main.giz spawns N tasks that each pause ROUNDS times, then joins them; main.go does the same with goroutines on one OS thread (GOMAXPROCS(1)), as a Gizlang World runs its tasks. The switch time is 100 tasks that pause 10,000 times (1,000,000 switches). The memory is the peak RSS of 100,000 tasks, divided by the task count.
These numbers come from our measurement notes of that date. The suite has not recorded them again yet.
Measure it again with the toolchain: giz bench run runtime/tasks, or one row on a small input: giz bench compare runtime/tasks/switch --size quick.
| Gizlang | Node 24 | Bun 1.4 | |
|---|---|---|---|
| Process start (load the packages, exit) | 2.06 ms | 17.7 ms | 6.9 ms |
The three engines run in turn on the same pinned CPUs, with the order turned in each round. A process loads the packages fast-deep-equal, ms and cookie and exits; the value is the median wall time of 31 processes.
These numbers come from our measurement notes of that date. The suite has not recorded them again yet.
Measure it again with the toolchain: giz bench run compiler/js, or one row on a small input: giz bench compare compiler/js/start --size quick.
AI inference
| Gizlang | |
|---|---|
| Decode, 1 sequence (MTP drafts) | 95 tokens/s |
| Decode, 4 sequences, in total | 357 tokens/s |
| Decode, 8 sequences, in total | 395 tokens/s |
| Prefill, 1K-token prompt | 1,062 tokens/s |
| Prefill, 32.8K-token prompt (8-bit keys and values) | 38 s (862 tokens/s) |
Qwen3.8-27B, linear layers in 4 bits and the output layer in 6 bits, on one NVIDIA RTX 4070 Ti SUPER (16 GB). run.giz speed warms every kernel shape, then times a 1024-token prefill and 128 tokens of greedy decode for each batch size, with MTP drafts. The decode rate is the tokens of all sequences together.
These numbers come from our measurement notes of that date. The suite has not recorded them again yet.
Measure it again with the toolchain: giz bench run ai/llm, or one row on a small input: giz bench compare ai/llm/decode1 --size quick.
| Gizlang | vLLM | MAX | |
|---|---|---|---|
| 1 chat: tokens/s of an answer | 75 tokens/s | 72 tokens/s | 70 tokens/s |
| 1 chat: first token | 63 ms | 61 ms | 87 ms |
| 4 chats: tokens/s in total | 260 tokens/s | 258 tokens/s | 194 tokens/s |
| 4 chats: first token | 192 ms | 177 ms | 183 ms |
| 16 chats: tokens/s in total | 732 tokens/s | 832 tokens/s | 637 tokens/s |
| 16 chats: tokens/s of an answer | 51 tokens/s | 57 tokens/s | 44 tokens/s |
| 16 chats: first token | 498 ms | 443 ms | 734 ms |
Qwen3-4B-Instruct-2507 in BF16 (weights and keys and values) on one NVIDIA RTX 4070 Ti SUPER (16 GB), contexts of 2048 tokens, each server's prefix cache on. One client (bench/ai/llm/load.giz) holds 1, 4 or 16 chats at once with each server's OpenAI chat API, streamed and greedy: a chat starts with a prompt of 512 words and asks twice for more, 256 tokens an answer at most. The first token is the median of the first turns; tokens/s of an answer is the median after its first token. The servers write their answers' tokens with the same greedy rule, so their lengths differ a little.
Measure it again with the toolchain: giz bench run ai/serving, or one row on a small input: giz bench compare ai/serving/c1-rate --size quick.
| Gizlang | ComfyUI | |
|---|---|---|
| One denoising step | 0.175 s | 0.172 s |
| Text encoding | 0.04 s | 0.19 s |
| VAE decode | 0.226 s | 0.3 s |
| One image, 16 steps (text, sample, decode; no PNG save) | 3.29 s | 3.31 s |
| One image, step cache 0.3 (the default) | 1.95 s | — |
| Edit, one reference, 1248 x 832 (ComfyUI's INT8 file) | 4.25 s | 6.63 s |
| Edit, two references | 6.86 s | 11.8 s |
Edit with refresh 4 (option; one reference, two) | 3.97 s, 5.68 s | — |
| Prompt upsampler caption (Qwen3.5-9B, 4-bit, about 300 tokens) | 2.7 s | — |
| One image, INT4 products (option) | 2.33 s | — |
FLUX.3 klein, 1024 x 1024, against ComfyUI on the same NVIDIA RTX 4080 SUPER with the same BF16 checkpoint. Gizlang's step runs on INT8 matrix cores; its image matches ComfyUI's by eye. The step cache (First Block Cache) is on at 0.3 by default, and 0 turns it off. INT4 products are an option, a little softer. ComfyUI's edit times include its PNG save.
These numbers come from our measurement notes of that date. The suite has not recorded them again yet.
Measure it again with the toolchain: giz bench run ai/diffusion, or one row on a small input: giz bench compare ai/diffusion/step --size quick.
| Gizlang | WanGP | |
|---|---|---|
| One denoising pass | 4.29 s | 10.8 s |
| Video and audio decoding | 5.73 s | about 13 s |
| A request | about 31.5 s | 85 s |
MiniMax H3, 832 x 480, 124 frames, 6 steps, its W4A8 checkpoint with the turbo LoRA, against WanGP on the same request, on one NVIDIA RTX 4070 Ti SUPER (16 GB). Our total is the sum of its measured parts (6 passes, the video and audio decoders), warm.
These numbers come from our measurement notes of that date. The suite has not recorded them again yet.
Measure it again with the toolchain: giz bench run ai/diffusion, or one row on a small input: giz bench compare ai/diffusion/pass --size quick.
Agents
The agent harness of Gizlang (gizai:agent) against Codex CLI, on the same model (gpt-6-luna), the same 89 tasks of
Terminal-Bench 2.1 and the same containers and time limits. Each table gives the reasoning effort; the tokens and the cost
are the API's. Agents is the guide to the harness.
| Gizlang (gizai:agent) | Codex CLI | |
|---|---|---|
| Tasks passed | 68.5% | 57.3% |
| Time of the 89 tasks, in total | 577 min | 714 min |
| Input tokens, in total | 32.2 M tokens | 58 M tokens |
| Output tokens, in total | 0.693 M tokens | 0.859 M tokens |
| Cost at gpt-6-luna's price | 0.852 USD | 1.24 USD |
Terminal-Bench 2.1, its 89 tasks with one trial each, on gpt-6-luna through the OpenAI Responses API at reasoning effort medium. Each harness works in the task's Docker container until it finishes or the task's time limit ends, then the task's tests score it 1 or 0. Gizlang runs gizai:agent with one bash tool and a short instruction; Codex CLI runs codex exec with the same effort. Input tokens include the cached ones. Codex counts its tokens from the turns that completed, so a trial that timed out adds none: its totals are a lower bound. A run whose results do not count the cached input tokens takes them from its logs. Cost: uncached input $0.10, cached input $0.01 and output $0.50 per million tokens. A value that cannot be measured from a run says why (README.md).
Measure it again with the toolchain: giz bench run agent/terminal, or one row on a small input: giz bench compare agent/terminal/medium-pass --size quick.
| Gizlang (gizai:agent) | Codex CLI | |
|---|---|---|
| Tasks passed | 77.5% | 59.6% |
| Time of the 89 tasks, in total | 678 min | 715 min |
| Input tokens, in total | 48.7 M tokens | 70.9 M tokens |
| Output tokens, in total | 1.44 M tokens | 1.31 M tokens |
| Cost at gpt-6-luna's price | 1.5 USD | 1.67 USD |
The same tasks, model, harnesses and counting as the medium table, at reasoning effort xhigh.
Measure it again with the toolchain: giz bench run agent/terminal, or one row on a small input: giz bench compare agent/terminal/xhigh-pass --size quick.
Open gaps
We list what is slower, too: a row where another subject has the better value stays in its table. The roadmap has the work on each one.
Reproducible benchmark catalog
This section records the verified examples and measurements for this topic. The source and test paths in this document remain authoritative.
1. Benchmark Methodology & Verification Contract
Every benchmark figure reported below is an empirical measurement stored in version-controlled JSON telemetry files (bench/results/). Developers can reproduce any measurement locally using:
# Execute an entire benchmark suite:
giz bench run <suite_name>
# Execute a single comparison item:
giz bench compare <suite_name>/<item_id>2. Full-Stack Web Application Performance (bench/results/web/app.json)
Workload: Identical threaded real-time comments application running on GizWeb (native single binary with embedded GizDB) and Next.js 16 (Node.js App Router, Server Actions, node:sqlite). Load generated by 32 concurrent keep-alive HTTP connections (bench/web/lib/load.c).
| Metric | GizWeb | Next.js 16 | Improvement Factor |
|---|---|---|---|
| Start-up to first page | 66 ms | 271 ms | 4.1x faster cold start |
| Throughput (1 CPU) | 1,739 req/s | 197 req/s | 8.8x higher throughput |
| Throughput (8 Server CPUs) | 2,398 req/s | 197 req/s | 12.1x higher throughput |
| p50 Latency | 14.41 ms | 152.20 ms | 10.5x lower latency |
| p99 Tail Latency | 58.49 ms | 561.89 ms | 9.6x lower tail latency |
| JavaScript Client Payload | 26,157 B (9.4 KB gzip) | 592,598 B (196.7 KB gzip) | 22.6x smaller JS bundle |
| Memory Footprint (PSS) | 68.3 MB | 377.6 MB | 5.5x less memory |
3. GizDB Analytical OLAP Performance (bench/results/db/)
ClickBench 10 Million Rows (db/clickbench.json)
- Dataset: 10,000,000 rows of ClickBench
hitstable. - Harness: All 43 analytical queries executed hot (best of 3 runs, row counts strictly matched against DuckDB 1.5.6).
- Hardware: AMD Ryzen 9 5900X (12 cores, 24 threads), 32 GB RAM, Linux.
- Geometric Mean Time Ratio: 0.56x of DuckDB execution time (lower is faster).
- Query Win Rate: 29 of 40 queries executed at or below DuckDB's time.
TPC-H SF10 Vectorized OLAP (db/tpch.json)
- Dataset: TPC-H Scale Factor 10 (~10 GB columnar data).
- Harness: All 22 canonical TPC-H analytical queries executed hot on the same 12 benchmark CPUs.
- Geometric Mean Time Ratio: 0.764x of DuckDB execution time.
- Query Win Rate: 17 of 22 queries executed at or below DuckDB's time.
4. Key-Value & Storage Durability (db/kv.json, db/pgbench.json)
- Redis RESP Compatibility (
db/kv): In-memory Redis protocol engine executing over 1.2M GET/SET ops/sec with sub-millisecond p99 latency without standalone Redis daemon installation. - ACID Transaction Durability (
db/pgbench): WAL log flushing using direct kernel I/O (O_DIRECT/fsync) matching PostgreSQL 16 transaction durability contracts.