Whole-process gzip benchmarks from gzipbench, stdin to stdout, so startup, threading, and IO all count.
Machine: Apple M5, 10 cpus, macOS 26.6.2 arm64, 2026-09-04.
Input: synthetic mixed 256 MiB (source-like text, build logs, random blocks, ~4.8:1 at gzip -6).
Library: gzip-ng, minigzip, pigz, pigzpp, and bgzip built against zlib-ng develop 1239e888 (2.3.90).
GNU gzip and MiGz do not link zlib. pigzpp runs with -E zlib.
| Variant | Speed | Ratio |
|---|---|---|
| bgzip -@ | 815 MB/s | 4.12 |
| gzip-ng -p | 790 MB/s | 4.40 |
| pigz -p | 752 MB/s | 4.61 |
| pigzpp -p | 731 MB/s | 4.61 |
| migz | 389 MB/s | 4.50 |
| gzip-ng / minigzip (serial) | 134 MB/s | 4.55 |
| gzip (serial) | 72 MB/s | 4.52 |
| Variant | Speed |
|---|---|
| gzip-ng -p 10 | 6.73 GB/s |
| bgzip -@ 10 | 5.29 GB/s |
| migz | 2.88 GB/s |
| gzip-ng | 1.28 GB/s |
| minigzip | 1.25 GB/s |
| pigzpp -p 10 | 892 MB/s |
| pigz -p 10 | 816 MB/s |
| gzip | 333 MB/s |
gzip-ng also decodes the foreign block-framed streams fastest: 6.19 GB/s on
MiGz output and 6.48 GB/s on bgzip output at -p 10.
- zlib-ng's level 9 compresses about 2.5% worse than its own level 8 on this input, so every zlib-ng tool shows a backturn at L9 in the scatter. Stock zlib and GNU gzip stay monotonic. Reproduces bit-for-bit on 2.2.4 stable.
- The deflate block census (32 MiB sample, level 6): rsyncable modes cut blocks to 2-3 kB of input (pigz 10,625 blocks, gzip-ng 16,573) versus 40-95 kB normally; bgzip frames 517 members, MiGz 64.
- Full per-level ladders (1-9), thread sweeps, cross-decode grid, and the census are in the attached table, JSON, and SVG.