Repository navigation
Benchmarks
- silesia.tar (211,957,760 bytes), in memory, the whole file as one block.
- One thread, pinned with
taskset -c 9, Xeon E5-2697A v4 (Broadwell, 2.6 GHz). - Speeds are the best of repeated runs over at least 2–3 s, MB = 10^6 bytes, on the input size (as lzbench).
- Competitors: lzbench 2.4.1 built with GCC 14.2, on the same core in the same session.
- The machine is shared: runs vary by up to ~10%.
taskset -c 9 out/sylzbench -l 1,9 -t 3 silesia.tar
SYLZ_NOASM=1 taskset -c 9 out/sylzbench -l 1,9 -t 3 silesia.tar # Pascal paths onlyv0.2.13 renumbers -ec: -ec 0 .. 8 parse as v2's 2 .. 10, and -ec 9 / 10 are new, the optimal parser with each literal priced by its Huffman code (a first parse counts the literals per 256 KiB region; their code lengths plus 1 bit price the parse that is emitted). v2 levels unchanged.
| -ec level | silesia.tar | compress | decompress | mixed corpus | compress | decompress |
|---|---|---|---|---|---|---|
| 0 | 38.80% | 179 MB/s | 2121 MB/s | 59.78% | 135 MB/s | 1429 MB/s |
| 1 | 37.99% | 150 MB/s | 2064 MB/s | 59.46% | 118 MB/s | 1434 MB/s |
| 2 | 36.72% | 75.5 MB/s | 1979 MB/s | 58.30% | 55.2 MB/s | 1474 MB/s |
| 3 | 35.79% | 56.2 MB/s | 2120 MB/s | 57.86% | 39.5 MB/s | 1468 MB/s |
| 4 | 35.18% | 44.0 MB/s | 2140 MB/s | 57.62% | 32.9 MB/s | 1436 MB/s |
| 5 | 34.80% | 34.2 MB/s | 2137 MB/s | 57.48% | 29.5 MB/s | 1542 MB/s |
| 6 | 34.47% | 20.8 MB/s | 2164 MB/s | 57.35% | 22.0 MB/s | 1550 MB/s |
| 7 | 33.99% | 7.47 MB/s | 2241 MB/s | 57.19% | 11.1 MB/s | 1574 MB/s |
| 8 | 33.98% | 6.35 MB/s | 2282 MB/s | 57.15% | 8.28 MB/s | 1585 MB/s |
| 9 | 33.61% | 3.75 MB/s | 2126 MB/s | 56.94% | 5.78 MB/s | 1541 MB/s |
| 10 | 33.60% | 3.13 MB/s | 2107 MB/s | 56.91% | 4.25 MB/s | 1596 MB/s |
Same session: v2 -10 36.03% at 3498 MB/s decode (mixed 60.39%, 3635 MB/s); zstd 1.5.7 -1 34.53% at 329 / 1061 MB/s (mixed 56.14%, 396 / 1129), -2 32.70% at 230 / 793, -3 31.20% at 157 / 693; zxc 0.15.0 -7 33.09% at 6.04 / 1905 MB/s (mixed 57.34%, 10.0 / 1786). One thread: decoding is Huffman then LZ, one after the other; a second thread for Huffman is next.
| level | silesia.tar | compress | decompress | mixed corpus | compress | decompress |
|---|---|---|---|---|---|---|
| -0 | 46.51% | 480 MB/s | 3070 MB/s | 66.31% | 678 MB/s | 3491 MB/s |
| -1 | 44.55% | 442 MB/s | 3136 MB/s | 65.59% | 633 MB/s | 3407 MB/s |
| -2 | 40.89% | 235 MB/s | 2978 MB/s | 63.29% | 277 MB/s | 3163 MB/s |
| -3 | 39.99% | 187 MB/s | 2958 MB/s | 62.89% | 204 MB/s | 3194 MB/s |
| -4 | 38.80% | 85.9 MB/s | 2976 MB/s | 61.55% | 69.8 MB/s | 3239 MB/s |
| -5 | 37.78% | 61.9 MB/s | 3029 MB/s | 61.10% | 47.9 MB/s | 3304 MB/s |
| -6 | 37.13% | 46.2 MB/s | 3061 MB/s | 60.83% | 39.4 MB/s | 3227 MB/s |
| -7 | 36.73% | 35.7 MB/s | 3113 MB/s | 60.68% | 33.6 MB/s | 3287 MB/s |
| -8 | 36.38% | 22.0 MB/s | 3135 MB/s | 60.55% | 23.9 MB/s | 3295 MB/s |
| -9 | 36.04% | 7.65 MB/s | 3449 MB/s | 60.42% | 11.4 MB/s | 3300 MB/s |
| -10 | 36.03% | 6.45 MB/s | 3393 MB/s | 60.39% | 8.37 MB/s | 3481 MB/s |
| -ec -8 | 34.47% | 21.6 MB/s | 2181 MB/s | 57.35% | 24.0 MB/s | 1597 MB/s |
| -ec -9 | 33.99% | 7.44 MB/s | 2219 MB/s | 57.19% | 11.3 MB/s | 1552 MB/s |
| -ec -10 | 33.98% | 6.37 MB/s | 2254 MB/s | 57.15% | 8.56 MB/s | 1662 MB/s |
v0.2.11 writes the same bytes as v0.2.10 at every level. New: C (src/sylzc.c) for the fast paths of 32-bit Windows and arm64 (see below), and on x86_64 the parse of -4 .. -8 and the candidate pass of -9 / -10 in C over the assembler searches (cycles: -4 1.15x faster, -6 1.07x, -8 1.05x, -9 1.02x).
Competitors in the same session (lzbench 2.4.1, GCC 14.2):
| codec | silesia.tar | compress | decompress | mixed corpus | compress | decompress |
|---|---|---|---|---|---|---|
| lz4 1.10.0 | 47.59% | 507 MB/s | 3132 MB/s | 66.17% | 734 MB/s | 3508 MB/s |
| lz4hc 1.10.0 -2 | 42.05% | 224 MB/s | 2805 MB/s | 63.84% | 245 MB/s | 3367 MB/s |
| lz4hc 1.10.0 -3 | 38.38% | 67.9 MB/s | 2823 MB/s | 61.30% | 52.6 MB/s | 3340 MB/s |
| lz4hc 1.10.0 -4 | 37.65% | 57.6 MB/s | 2878 MB/s | 61.00% | 48.3 MB/s | 3517 MB/s |
| lz4hc 1.10.0 -6 | 36.98% | 42.4 MB/s | 3064 MB/s | 60.76% | 42.6 MB/s | 3476 MB/s |
| lz4hc 1.10.0 -9 | 36.75% | 27.0 MB/s | 3050 MB/s | 60.65% | 29.6 MB/s | 3377 MB/s |
| lz4hc 1.10.0 -12 | 36.45% | 9.39 MB/s | 3200 MB/s | 60.52% | 9.73 MB/s | 3385 MB/s |
| lizard 2.1 -12 | 40.68% | 115 MB/s | 2791 MB/s | 63.38% | 97.0 MB/s | 3325 MB/s |
| lizard 2.1 -19 | 36.52% | 3.78 MB/s | 2879 MB/s | 60.76% | 4.85 MB/s | 3079 MB/s |
| misa77 0.6.0 --1 | 46.74% | 265 MB/s | 4069 MB/s | 68.12% | 298 MB/s | 3746 MB/s |
| misa77 0.6.0 -0 | 44.60% | 166 MB/s | 3961 MB/s | 66.80% | 166 MB/s | 3855 MB/s |
| misa77 0.6.0 -3 | 37.76% | 10.3 MB/s | 3874 MB/s | 62.46% | 10.3 MB/s | 3783 MB/s |
| zxc 0.15.0 -3 | 46.65% | 155 MB/s | 3457 MB/s | 71.89% | 267 MB/s | 3291 MB/s |
| zxc 0.15.0 -4 | 43.43% | 114 MB/s | 3442 MB/s | 67.54% | 190 MB/s | 3698 MB/s |
| zxc 0.15.0 -5 | 40.83% | 68.8 MB/s | 3431 MB/s | 63.75% | 104 MB/s | 3722 MB/s |
| zxc 0.15.0 -6 | 36.28% | 9.31 MB/s | 2891 MB/s | 61.45% | 15.3 MB/s | 3400 MB/s |
| zxc 0.15.0 -7 | 33.09% | 6.41 MB/s | 1978 MB/s | 57.34% | 10.7 MB/s | 1823 MB/s |
| zstd 1.5.7 -1 | 34.53% | 350 MB/s | 1135 MB/s | 56.14% | 409 MB/s | 1250 MB/s |
| zstd 1.5.7 -2 | 32.70% | 238 MB/s | 814 MB/s | 54.88% | 325 MB/s | 1152 MB/s |
| zstd 1.5.7 -3 | 31.20% | 153 MB/s | 678 MB/s | 52.80% | 177 MB/s | 1054 MB/s |
Windows 7 32-bit (a VM under KVM on the same Xeon; absolute speeds approximate, the C/Pascal ratio is what counts), mozilla (51 MB), the release's sylzbench: the C paths (default) against the Pascal ones (SYLZ_NOASM=1). Same output both ways.
| level | ratio | compress, C | compress, Pascal | decode, C | decode, Pascal |
|---|---|---|---|---|---|
| -0 | 50.22% | 318 MB/s | 149 MB/s | 1724 MB/s | 894 MB/s |
| -1 | 49.45% | 282 MB/s | 177 MB/s | 1638 MB/s | 851 MB/s |
| -2 | 46.67% | 176 MB/s | 139 MB/s | 1942 MB/s | 986 MB/s |
| -3 | 45.83% | 137 MB/s | 101 MB/s | 1965 MB/s | 955 MB/s |
| -4 | 44.34% | 66.6 MB/s | 39.8 MB/s | 2074 MB/s | 1023 MB/s |
| -6 | 43.35% | 40.7 MB/s | 23.0 MB/s | 2151 MB/s | 1048 MB/s |
| -8 | 42.84% | 18.6 MB/s | 11.1 MB/s | 2101 MB/s | 1075 MB/s |
| -9 | 42.66% | 6.73 MB/s | 5.90 MB/s | 2272 MB/s | 1146 MB/s |
| -10 | 42.64% | 5.74 MB/s | 4.78 MB/s | 2370 MB/s | 1121 MB/s |
The decoder's C uses SSE2 on 32-bit x86 where the CPU has it (picked at run time from v0.2.12; v0.2.11 required it); the compressors stay plain i686. On 32-bit the fast levels hash 4 bytes, so -0/-1 ratios differ from 64-bit builds. arm64 runs the same C paths (tested under qemu-user, which is too slow to time).
Levels 0-8 are unchanged from v0.2.9 (same output; their speeds this session ran ~10% under the v0.2.9 table below).
| level | silesia.tar | compress | decompress | mixed corpus | compress | decompress |
|---|---|---|---|---|---|---|
| -8 | 36.38% | 21.0 MB/s | 2954 MB/s | 60.55% | 23.3 MB/s | 3045 MB/s |
| -9 | 36.04% | 6.98 MB/s | 3182 MB/s | 60.42% | 9.98 MB/s | 3142 MB/s |
| -10 | 36.03% | 5.95 MB/s | 3043 MB/s | 60.39% | 7.63 MB/s | 3197 MB/s |
| -ec -9 | 33.99% | 6.59 MB/s | 2016 MB/s | 57.19% | 10.1 MB/s | 1444 MB/s |
| -ec -10 | 33.98% | 5.80 MB/s | 2110 MB/s | 57.15% | 7.59 MB/s | 1440 MB/s |
v0.2.9's -9 capped matches at the tree's compare length (256 bytes), so long runs came out as 256-byte pieces, and its depth 16 was too shallow on very redundant data. Found on zpaq-std's mixed sample (16 MB: binaries, a 2 MB run, random data, small files): -9 18.56% in v0.2.9, 18.12% in v0.2.8, 17.73% now (-8: 17.71%); -10 17.59%. A match reaching the compare length is now extended as far as the bytes go, and the depths are 32 (-9) and 256 (-10).
Competitors in the same session:
| codec | silesia.tar | compress | decompress | mixed corpus | compress | decompress |
|---|---|---|---|---|---|---|
| lz4hc 1.10.0 -9 | 36.75% | 26.3 MB/s | 2787 MB/s | 60.65% | 27.0 MB/s | 3024 MB/s |
| lz4hc 1.10.0 -12 | 36.45% | 8.88 MB/s | 2918 MB/s | 60.52% | 9.15 MB/s | 2779 MB/s |
| lizard 2.1 -19 | 36.52% | 3.38 MB/s | 2358 MB/s | 60.76% | 4.06 MB/s | 2914 MB/s |
| zxc 0.15.0 -6 | 36.28% | 7.83 MB/s | 2480 MB/s | 61.45% | 13.3 MB/s | 2905 MB/s |
| misa77 0.6.0 -3 | 37.76% | 9.08 MB/s | 3294 MB/s | 62.46% | 9.61 MB/s | 3388 MB/s |
| zstd 1.5.7 -1 | 34.53% | 298 MB/s | 962 MB/s | 56.14% | 370 MB/s | 1065 MB/s |
| level | silesia.tar | compress | decompress | mixed corpus | compress | decompress |
|---|---|---|---|---|---|---|
| -0 | 46.51% | 492 MB/s | 3200 MB/s | 66.31% | 741 MB/s | 3579 MB/s |
| -1 | 44.55% | 473 MB/s | 3286 MB/s | 65.59% | 687 MB/s | 3679 MB/s |
| -2 | 40.89% | 272 MB/s | 2953 MB/s | 63.29% | 308 MB/s | 3452 MB/s |
| -3 | 39.99% | 189 MB/s | 3108 MB/s | 62.89% | 222 MB/s | 3361 MB/s |
| -4 | 38.80% | 79.9 MB/s | 3120 MB/s | 61.55% | 68.2 MB/s | 3361 MB/s |
| -5 | 37.78% | 58.5 MB/s | 3204 MB/s | 61.10% | 47.9 MB/s | 3399 MB/s |
| -6 | 37.13% | 44.0 MB/s | 3207 MB/s | 60.83% | 40.6 MB/s | 3443 MB/s |
| -7 | 36.73% | 33.8 MB/s | 3236 MB/s | 60.68% | 35.4 MB/s | 3445 MB/s |
| -8 | 36.38% | 20.7 MB/s | 3263 MB/s | 60.55% | 25.2 MB/s | 3360 MB/s |
| -9 | 36.17% | 7.91 MB/s | 3506 MB/s | 60.61% | 11.2 MB/s | 3445 MB/s |
| -10 | 36.04% | 6.78 MB/s | 3650 MB/s | 60.41% | 9.05 MB/s | 3636 MB/s |
| -ec -8 | 34.47% | 23.5 MB/s | 2349 MB/s | 57.35% | 23.2 MB/s | 1619 MB/s |
| -ec -9 | 34.11% | 7.67 MB/s | 2310 MB/s | 57.38% | 11.5 MB/s | 1699 MB/s |
| -ec -10 | 33.99% | 6.42 MB/s | 2417 MB/s | 57.18% | 8.87 MB/s | 1700 MB/s |
New in v0.2.9: -9 and -10's optimal parser takes its candidates from a binary tree (LZMA's bt4 without its 2- and 3-byte hashes; depth 16 and 128), in x86-64 assembler, and prices them with integers from a table. v0.2.8: -9 36.37% at 4.2 MB/s, -10 36.12% at 2.0 MB/s.
Competitors in the same session (lzbench 2.4.1, GCC 14.2):
| codec | silesia.tar | compress | decompress | mixed corpus | compress | decompress |
|---|---|---|---|---|---|---|
| lz4 1.10.0 | 47.59% | 516 MB/s | 3225 MB/s | 66.17% | 677 MB/s | 3137 MB/s |
| lz4hc 1.10.0 -2 | 42.05% | 223 MB/s | 2887 MB/s | 63.84% | 203 MB/s | 2834 MB/s |
| lz4hc 1.10.0 -3 | 38.38% | 72.9 MB/s | 2993 MB/s | 61.30% | 46.3 MB/s | 2894 MB/s |
| lz4hc 1.10.0 -4 | 37.65% | 60.5 MB/s | 2995 MB/s | 61.00% | 42.3 MB/s | 3100 MB/s |
| lz4hc 1.10.0 -6 | 36.98% | 41.7 MB/s | 3063 MB/s | 60.76% | 38.7 MB/s | 3110 MB/s |
| lz4hc 1.10.0 -9 | 36.75% | 27.0 MB/s | 3010 MB/s | 60.65% | 28.6 MB/s | 3154 MB/s |
| lz4hc 1.10.0 -12 | 36.45% | 9.03 MB/s | 3023 MB/s | 60.52% | 9.04 MB/s | 3022 MB/s |
| lizard 2.1 -12 | 40.68% | 111 MB/s | 2583 MB/s | 63.38% | 89.6 MB/s | 2972 MB/s |
| lizard 2.1 -19 | 36.52% | 3.42 MB/s | 2455 MB/s | 60.76% | 4.23 MB/s | 2792 MB/s |
| misa77 0.6.0 --1 | 46.74% | 229 MB/s | 3436 MB/s | 68.12% | 263 MB/s | 3576 MB/s |
| misa77 0.6.0 -0 | 44.60% | 143 MB/s | 3402 MB/s | 66.80% | 152 MB/s | 3504 MB/s |
| misa77 0.6.0 -3 | 37.76% | 9.44 MB/s | 3325 MB/s | 62.46% | 9.46 MB/s | 3382 MB/s |
| zxc 0.15.0 -3 | 46.65% | 135 MB/s | 3069 MB/s | 71.89% | 243 MB/s | 3215 MB/s |
| zxc 0.15.0 -4 | 43.43% | 99.7 MB/s | 3022 MB/s | 67.54% | 167 MB/s | 3287 MB/s |
| zxc 0.15.0 -5 | 40.83% | 61.2 MB/s | 3079 MB/s | 63.75% | 88.8 MB/s | 3218 MB/s |
| zxc 0.15.0 -6 | 36.28% | 8.36 MB/s | 2705 MB/s | 61.45% | 12.9 MB/s | 2990 MB/s |
| zxc 0.15.0 -7 | 33.09% | 5.70 MB/s | 1807 MB/s | 57.34% | 9.15 MB/s | 1728 MB/s |
| zstd 1.5.7 -1 | 34.53% | 301 MB/s | 1033 MB/s | 56.14% | 377 MB/s | 1081 MB/s |
| zstd 1.5.7 -2 | 32.70% | 222 MB/s | 745 MB/s | 54.88% | 283 MB/s | 997 MB/s |
| zstd 1.5.7 -3 | 31.20% | 150 MB/s | 623 MB/s | 52.80% | 156 MB/s | 902 MB/s |
At the top, -10 is 0.41 points under lz4hc -12 and 0.48 under lizard -19 on silesia.tar (0.11 and 0.35 on the mixed corpus), decoding 20% and 49% faster.
| level | silesia.tar | compress | decompress | mixed corpus | compress | decompress |
|---|---|---|---|---|---|---|
| -0 | 46.51% | 482 MB/s | 3083 MB/s | 66.31% | 636 MB/s | 3131 MB/s |
| -1 | 44.55% | 453 MB/s | 3088 MB/s | 65.59% | 602 MB/s | 3186 MB/s |
| -2 | 40.89% | 251 MB/s | 2874 MB/s | 63.29% | 267 MB/s | 2753 MB/s |
| -3 | 39.99% | 190 MB/s | 2900 MB/s | 62.89% | 193 MB/s | 2953 MB/s |
| -4 | 38.80% | 77.2 MB/s | 2919 MB/s | 61.55% | 62.1 MB/s | 2927 MB/s |
| -5 | 37.78% | 55.3 MB/s | 3004 MB/s | 61.10% | 43.2 MB/s | 2941 MB/s |
| -6 | 37.13% | 42.0 MB/s | 3041 MB/s | 60.83% | 36.8 MB/s | 3017 MB/s |
| -7 | 36.73% | 31.9 MB/s | 3045 MB/s | 60.68% | 32.0 MB/s | 3029 MB/s |
| -8 | 36.38% | 19.6 MB/s | 3063 MB/s | 60.55% | 23.2 MB/s | 2905 MB/s |
| -9 | 36.37% | 4.24 MB/s | 3164 MB/s | 60.63% | 7.49 MB/s | 3277 MB/s |
| -10 | 36.12% | 2.04 MB/s | 3100 MB/s | 60.49% | 3.68 MB/s | 3166 MB/s |
| -ec -8 | 34.47% | 20.0 MB/s | 1942 MB/s | 57.35% | 21.6 MB/s | 1449 MB/s |
| -ec -9 | 34.29% | 4.42 MB/s | 2092 MB/s | 57.37% | 7.09 MB/s | 1548 MB/s |
| -ec -10 | 34.06% | 2.09 MB/s | 2128 MB/s | 57.26% | 3.66 MB/s | 1440 MB/s |
New in v0.2.8: -4 .. -8 use lz4hc's parse (a match may start inside the previous one and extend backwards) with 2, 4, 8, 16, 64 attempts, and their chain search is in x86-64 assembler. -8 now matches -9's ratio (on the mixed corpus it beats it) at ~4.6x its speed; -9 keeps the fastest decode of the high levels.
Competitors in the same session (lzbench 2.4.1, GCC 14.2):
| codec | silesia.tar | compress | decompress | mixed corpus | compress | decompress |
|---|---|---|---|---|---|---|
| lz4 1.10.0 | 47.59% | 445 MB/s | 2769 MB/s | 66.17% | 666 MB/s | 3138 MB/s |
| lz4hc 1.10.0 -2 | 42.05% | 190 MB/s | 2484 MB/s | 63.84% | 210 MB/s | 2836 MB/s |
| lz4hc 1.10.0 -3 | 38.38% | 63.6 MB/s | 2588 MB/s | 61.30% | 46.7 MB/s | 3045 MB/s |
| lz4hc 1.10.0 -4 | 37.65% | 52.2 MB/s | 2602 MB/s | 61.00% | 43.3 MB/s | 2989 MB/s |
| lz4hc 1.10.0 -6 | 36.98% | 37.9 MB/s | 2647 MB/s | 60.76% | 37.5 MB/s | 3092 MB/s |
| lz4hc 1.10.0 -9 | 36.75% | 23.9 MB/s | 2742 MB/s | 60.65% | 27.9 MB/s | 3084 MB/s |
| lizard 2.1 -12 | 40.68% | 99.0 MB/s | 2390 MB/s | 63.38% | 88.8 MB/s | 2979 MB/s |
| misa77 0.6.0 --1 | 46.74% | 219 MB/s | 3489 MB/s | 68.12% | 289 MB/s | 3627 MB/s |
| misa77 0.6.0 -0 | 44.60% | 139 MB/s | 3493 MB/s | 66.80% | 164 MB/s | 3749 MB/s |
| zxc 0.15.0 -3 | 46.65% | 139 MB/s | 3307 MB/s | 71.89% | 250 MB/s | 3236 MB/s |
| zxc 0.15.0 -4 | 43.43% | 97.3 MB/s | 3182 MB/s | 67.54% | 174 MB/s | 3302 MB/s |
| zxc 0.15.0 -5 | 40.83% | 62.2 MB/s | 3119 MB/s | 63.75% | 93.5 MB/s | 3395 MB/s |
| zxc 0.15.0 -6 | 36.28% | 7.56 MB/s | 2608 MB/s | 61.45% | 13.7 MB/s | 3181 MB/s |
| zxc 0.15.0 -7 | 33.09% | 5.44 MB/s | 1817 MB/s | 57.34% | 9.85 MB/s | 1705 MB/s |
| zstd 1.5.7 -1 | 34.53% | 303 MB/s | 962 MB/s | 56.14% | 397 MB/s | 1134 MB/s |
| zstd 1.5.7 -2 | 32.70% | 214 MB/s | 721 MB/s | 54.88% | 296 MB/s | 1074 MB/s |
| zstd 1.5.7 -3 | 31.20% | 143 MB/s | 616 MB/s | 52.80% | 157 MB/s | 916 MB/s |
Against lz4hc level for level (-4/-3, -5/-4, -6/-6): sylz within 0.1-0.4 points of its ratio, compressing 6-21% faster and decoding 13-16% faster on silesia.tar; -7 matches lz4hc -9's ratio at 1.3x its speed, -8 beats it by 0.4 points.
| level | silesia.tar | compress | decompress | mixed corpus | compress | decompress |
|---|---|---|---|---|---|---|
| -0 | 46.51% | 507 MB/s | 3150 MB/s | 66.31% | 636 MB/s | 3083 MB/s |
| -1 | 44.55% | 455 MB/s | 3143 MB/s | 65.59% | 575 MB/s | 3129 MB/s |
| -2 | 40.89% | 255 MB/s | 2955 MB/s | 63.29% | 249 MB/s | 3065 MB/s |
| -3 | 39.99% | 189 MB/s | 2990 MB/s | 62.89% | 190 MB/s | 3011 MB/s |
| -4 | 39.35% | 60.9 MB/s | 2975 MB/s | 61.94% | 46.8 MB/s | 2931 MB/s |
| -5 | 38.35% | 52.7 MB/s | 3031 MB/s | 61.50% | 43.8 MB/s | 2958 MB/s |
| -6 | 37.65% | 44.4 MB/s | 3060 MB/s | 61.20% | 41.4 MB/s | 3168 MB/s |
| -7 | 36.89% | 30.2 MB/s | 3100 MB/s | 60.89% | 33.6 MB/s | 2939 MB/s |
| -8 | 36.60% | 19.3 MB/s | 3087 MB/s | 60.73% | 25.3 MB/s | 3120 MB/s |
| -9 | 36.37% | 5.29 MB/s | 3397 MB/s | 60.63% | 9.91 MB/s | 3513 MB/s |
| -10 | 36.12% | 2.50 MB/s | 3171 MB/s | 60.49% | 5.27 MB/s | 3488 MB/s |
| -ec -8 | 34.82% | 20.2 MB/s | 2190 MB/s | 57.60% | 25.6 MB/s | 1630 MB/s |
| -ec -9 | 34.29% | 5.47 MB/s | 2273 MB/s | 57.37% | 10.3 MB/s | 1630 MB/s |
| -ec -10 | 34.06% | 2.75 MB/s | 2411 MB/s | 57.26% | 5.42 MB/s | 1651 MB/s |
Single hash (-0, -1), two hash tables keyed on 6 and 4 bytes (-2 greedy, -3 lazy; new in v0.2.6), lazy hash chains with 4 to 256 attempts (-4 .. -8), decode-aware optimal parser (-9, -10). -ec is format v3 (experimental).
Competitors in the same session (lzbench 2.4.1, GCC 14.2):
| codec | silesia.tar | compress | decompress | mixed corpus | compress | decompress |
|---|---|---|---|---|---|---|
| lz4 1.10.0 | 47.59% | 518 MB/s | 3199 MB/s | 66.17% | 789 MB/s | 3527 MB/s |
| lz4hc 1.10.0 -2 | 42.05% | 229 MB/s | 2861 MB/s | 63.84% | 246 MB/s | 3304 MB/s |
| lz4hc 1.10.0 -9 | 36.75% | 26.5 MB/s | 3103 MB/s | 60.65% | 31.4 MB/s | 3528 MB/s |
| lizard 2.1 -12 | 40.68% | 115 MB/s | 2785 MB/s | 63.38% | 100 MB/s | 3328 MB/s |
| misa77 0.6.0 --1 | 46.74% | 265 MB/s | 3914 MB/s | 68.12% | 313 MB/s | 3850 MB/s |
| misa77 0.6.0 -0 | 44.60% | 160 MB/s | 3853 MB/s | 66.80% | 175 MB/s | 4038 MB/s |
| zxc 0.15.0 -3 | 46.65% | 151 MB/s | 3413 MB/s | 71.89% | 284 MB/s | 3523 MB/s |
| zxc 0.15.0 -4 | 43.43% | 110 MB/s | 3355 MB/s | 67.54% | 192 MB/s | 3646 MB/s |
| zxc 0.15.0 -5 | 40.83% | 67.0 MB/s | 3344 MB/s | 63.75% | 103 MB/s | 3496 MB/s |
| zxc 0.15.0 -6 | 36.28% | 9.10 MB/s | 2888 MB/s | 61.45% | 15.0 MB/s | 3206 MB/s |
| zxc 0.15.0 -7 | 33.09% | 6.38 MB/s | 1956 MB/s | 57.34% | 10.5 MB/s | 1748 MB/s |
| zstd 1.5.7 -1 | 34.53% | 344 MB/s | 1115 MB/s | 56.14% | 430 MB/s | 1215 MB/s |
| zstd 1.5.7 -2 | 32.70% | 240 MB/s | 811 MB/s | 54.88% | 320 MB/s | 1114 MB/s |
| zstd 1.5.7 -3 | 31.20% | 161 MB/s | 700 MB/s | 52.80% | 174 MB/s | 1007 MB/s |
On both corpora -2 is smaller and faster than lz4hc -2 (LZ4MID), and -3 smaller than lizard -12 at 1.6-1.9x its speed.
| level | silesia.tar | compress | decompress | mixed corpus | compress | decompress |
|---|---|---|---|---|---|---|
| -0 | 46.51% | 518 MB/s | 3314 MB/s | 66.31% | 715 MB/s | 3528 MB/s |
| -1 | 44.55% | 482 MB/s | 3298 MB/s | 65.59% | 652 MB/s | 3523 MB/s |
| -2 | 44.19% | 457 MB/s | 3287 MB/s | 65.45% | 578 MB/s | 3300 MB/s |
| -3 | 40.75% | 71.6 MB/s | 3037 MB/s | 62.60% | 53.7 MB/s | 3184 MB/s |
| -4 | 39.35% | 61.8 MB/s | 2997 MB/s | 61.94% | 51.5 MB/s | 3250 MB/s |
| -5 | 38.35% | 53.3 MB/s | 3042 MB/s | 61.50% | 48.4 MB/s | 3325 MB/s |
| -6 | 37.65% | 45.4 MB/s | 3064 MB/s | 61.20% | 45.0 MB/s | 3341 MB/s |
| -7 | 36.89% | 31.8 MB/s | 3223 MB/s | 60.89% | 37.5 MB/s | 3370 MB/s |
| -8 | 36.60% | 20.9 MB/s | 3131 MB/s | 60.73% | 28.2 MB/s | 3416 MB/s |
| -9 | 36.37% | 5.59 MB/s | 3592 MB/s | 60.63% | 10.1 MB/s | 3552 MB/s |
| -10 | 36.12% | 2.72 MB/s | 3536 MB/s | 60.49% | 5.21 MB/s | 3422 MB/s |
Single hash with 16-bit position tables of 2^13, 2^15 and 2^16 entries (-0 .. -2), lazy hash chains with 2, 4, 8, 16, 64 and 256 attempts (-3 .. -8), decode-aware optimal parser (-9, -10). In the same session lz4 1.10.0 made 501 MB/s, 3073 MB/s, 47.59% and zstd 1.5.7 -1 315 MB/s, 1054 MB/s, 34.53%; this session ran about 5% slower than the one in the README.
The sections below use the level numbers of v0.2.4 and earlier: --fast=2, --fast=1, -1 .. -12. They also write format v3 as -e, which is -ec (extra compression) from the CLI after v0.2.5. From v0.2.5, old -3 .. -6 are the same as new -3 .. -6, old -8 is new -7, old -10 is new -8, and old -11, -12 are new -9, -10. The old fast levels were replaced by -0 .. -2.
| codec | silesia.tar | compress | decompress | mixed corpus | compress | decompress |
|---|---|---|---|---|---|---|
| zstd 1.5.7 --fast=1 | 41.01% | 352 MB/s | 1285 MB/s | 61.99% | 485 MB/s | 1576 MB/s |
| zstd 1.5.7 -1 | 34.53% | 317 MB/s | 1035 MB/s | 56.14% | 377 MB/s | 1080 MB/s |
| zstd 1.5.7 -2 | 32.70% | 223 MB/s | 757 MB/s | 54.88% | 282 MB/s | 995 MB/s |
| zstd 1.5.7 -3 | 31.20% | 152 MB/s | 650 MB/s | 52.80% | 154 MB/s | 894 MB/s |
| zstd 1.5.7 -5 | 29.60% | 91.8 MB/s | 598 MB/s | 52.31% | 101 MB/s | 847 MB/s |
| zstd 1.5.7 -9 | 27.87% | 49.1 MB/s | 609 MB/s | 49.38% | 69.5 MB/s | 893 MB/s |
| zxc 0.15.0 -6 | 36.28% | 8.46 MB/s | 2655 MB/s | 61.45% | 13.3 MB/s | 2960 MB/s |
| zxc 0.15.0 -7 | 33.09% | 5.67 MB/s | 1866 MB/s | 57.34% | 9.49 MB/s | 1725 MB/s |
| lz4hc 1.10.0 -9 | 36.75% | 25.6 MB/s | 2784 MB/s | 60.65% | 28.0 MB/s | 2963 MB/s |
| sylz -11 (v2) | 36.37% | 5.24 MB/s | 3170 MB/s | 60.63% | 9.43 MB/s | 3127 MB/s |
| sylz -12 (v2) | 36.12% | 2.52 MB/s | 3238 MB/s | 60.49% | 4.90 MB/s | 3181 MB/s |
| sylz -e -1 (v3) | 39.50% | 181 MB/s | 1525 MB/s | 60.16% | 150 MB/s | 1175 MB/s |
| sylz -e -6 (v3) | 35.83% | 41.6 MB/s | 2026 MB/s | 58.05% | 36.6 MB/s | 1368 MB/s |
| sylz -e -10 (v3) | 34.82% | 19.5 MB/s | 2062 MB/s | 57.60% | 24.2 MB/s | 1397 MB/s |
| sylz -e -11 (v3) | 34.29% | 4.99 MB/s | 2032 MB/s | 57.37% | 9.33 MB/s | 1441 MB/s |
| sylz -e -12 (v3) | 34.06% | 2.52 MB/s | 2080 MB/s | 57.26% | 5.00 MB/s | 1442 MB/s |
On silesia.tar sylz v3 beats zstd -1 on ratio at about twice its decompression speed, and decodes faster than zxc -7 one point behind it on ratio; it compresses far slower than zstd. On the mixed corpus zstd -1 is smaller: it entropy-codes matches and offsets too, which sylz does not yet.
| level | silesia.tar | compress | decompress | mixed corpus | compress | decompress |
|---|---|---|---|---|---|---|
| --fast=2 | 48.64% | 550 MB/s | 3345 MB/s | 66.96% | 697 MB/s | 3366 MB/s |
| --fast=1 | 46.51% | 482 MB/s | 3401 MB/s | 66.31% | 594 MB/s | 3245 MB/s |
| -1 | 45.26% | 421 MB/s | 3436 MB/s | 65.86% | 493 MB/s | 3260 MB/s |
| -2 | 44.20% | 316 MB/s | 3370 MB/s | 65.45% | 361 MB/s | 3259 MB/s |
| -3 | 40.75% | 74.0 MB/s | 3139 MB/s | 62.60% | 52.3 MB/s | 2946 MB/s |
| -4 | 39.35% | 66.9 MB/s | 3221 MB/s | 61.94% | 48.4 MB/s | 2956 MB/s |
| -5 | 38.35% | 58.0 MB/s | 3237 MB/s | 61.50% | 45.9 MB/s | 3042 MB/s |
| -6 | 37.65% | 47.1 MB/s | 3159 MB/s | 61.20% | 43.2 MB/s | 3151 MB/s |
| -7 | 37.19% | 39.4 MB/s | 3177 MB/s | 61.01% | 39.8 MB/s | 3114 MB/s |
| -8 | 36.89% | 32.7 MB/s | 3311 MB/s | 60.89% | 35.7 MB/s | 3107 MB/s |
| -9 | 36.71% | 27.6 MB/s | 3325 MB/s | 60.81% | 31.3 MB/s | 3122 MB/s |
| -10 | 36.60% | 22.0 MB/s | 3349 MB/s | 60.73% | 26.9 MB/s | 3148 MB/s |
| -11 | 36.37% | 5.79 MB/s | 3683 MB/s | 60.63% | 9.98 MB/s | 3398 MB/s |
| -12 | 36.12% | 2.77 MB/s | 3351 MB/s | 60.49% | 5.22 MB/s | 3326 MB/s |
Single hash (--fast=2 .. -2), lazy hash chains (-3 .. -10), decode-aware optimal parser (-11, -12). Against zxc 0.15.0 -6 (36.28%, 2755 MB/s, 9.42 MB/s): -11 decodes 34% faster at about its ratio, -12 is smaller and 22% faster.
| codec | compress | decompress | ratio |
|---|---|---|---|
| lz4 1.10.0 | 492 MB/s | 2979 MB/s | 47.59% |
| lz4 --fast -4 | 598 MB/s | 3039 MB/s | 51.45% |
| zxc 0.15.0 -2 | 330 MB/s | 3923 MB/s | 53.86% |
| zxc 0.15.0 -3 | 159 MB/s | 3464 MB/s | 46.65% |
| zxc 0.15.0 -4 | 117 MB/s | 3421 MB/s | 43.43% |
| zxc 0.15.0 -5 | 69.8 MB/s | 3454 MB/s | 40.83% |
| misa77 0.6.0 --1 | 277 MB/s | 3979 MB/s | 46.74% |
| misa77 0.6.0 -0 | 171 MB/s | 3963 MB/s | 44.60% |
| sylz --fast=2 | 565 MB/s | 3364 MB/s | 48.64% |
| sylz --fast=1 | 508 MB/s | 3433 MB/s | 46.51% |
| sylz -1 | 432 MB/s | 3421 MB/s | 45.26% |
| sylz -2 | 322 MB/s | 3245 MB/s | 44.20% |
| sylz -3 | 73.7 MB/s | 3002 MB/s | 40.75% |
The fast levels hash 6 bytes (5 before 2026-10-18) and differ only in the hash table size: 2^12, 2^13, 2^14, 2^16. The sweep behind it is in NOTES.md.
zxc 0.15.0, same core, lzbench 2.4.1 without -march=native (zxc's own published numbers use it):
| codec | compress | decompress | ratio |
|---|---|---|---|
| zxc -1 | 522 MB/s | 3936 MB/s | 61.76% |
| zxc -2 | 364 MB/s | 3894 MB/s | 53.86% |
| zxc -3 | 160 MB/s | 3422 MB/s | 46.65% |
| zxc -4 | 117 MB/s | 3414 MB/s | 43.43% |
| zxc -5 | 71.3 MB/s | 3407 MB/s | 40.83% |
| zxc -6 | 9.42 MB/s | 2755 MB/s | 36.28% |
| zxc -7 | 6.30 MB/s | 1856 MB/s | 33.09% |
| lz4 (same run) | 515 MB/s | 3080 MB/s | 47.59% |
| sylz -1 (same load) | 383 MB/s | 3103 MB/s | 44.18% |
| sylz -2 | 73.4 MB/s | 2892 MB/s | 40.75% |
| sylz -9 | 21.2 MB/s | 3333 MB/s | 36.60% |
zxc leads around 40–46%, sylz around 36%; sylz compresses 3.3x faster at a similar ratio.
| codec | compress | decompress | ratio |
|---|---|---|---|
| lz4 1.10.0 | 544 MB/s | 3302 MB/s | 47.59% |
| misa77 0.6.0 --1 | 284 MB/s | 3995 MB/s | 46.74% |
| misa77 0.6.0 -0 | 171 MB/s | 3962 MB/s | 44.60% |
| misa77 0.6.0 -1 | 51.8 MB/s | 4118 MB/s | 42.64% |
| misa77 0.6.0 -3 | 11.3 MB/s | 3785 MB/s | 37.76% |
| lizard 2.1 -10 | 436 MB/s | 2960 MB/s | 48.78% |
| zstd 1.5.7 --fast=1 | 392 MB/s | 1402 MB/s | 41.01% |
| zstd 1.5.7 -1 | 345 MB/s | 1146 MB/s | 34.53% |
| lz4hc 1.10.0 -9 | 28.2 MB/s | 3230 MB/s | 36.75% |
| sylz -1 | 423 MB/s | 3178 MB/s | 44.18% |
| sylz -2 | 77.3 MB/s | 3069 MB/s | 40.75% |
| sylz -9 | 21.9 MB/s | 3229 MB/s | 36.60% |
v1 against v2, same session:
| v1 decode | v2 decode | v1 ratio | v2 ratio | |
|---|---|---|---|---|
| silesia -1 | 3000 MB/s | 3150 MB/s | 44.62% | 44.18% |
| silesia -9 | 3209 MB/s | 3254 MB/s | 36.88% | 36.60% |
| mixed -1 | 3143 MB/s | 3411 MB/s | 65.30% | 64.96% |
| mixed -9 | 3196 MB/s | 3380 MB/s | 61.01% | 60.73% |
| codec | compress | decompress | ratio |
|---|---|---|---|
| lz4 1.10.0 | 515 MB/s | 3105 MB/s | 47.59% |
| lz4 --fast -4 | 613 MB/s | 3169 MB/s | 51.45% |
| misa77 0.6.0 --1 | 260 MB/s | 3746 MB/s | 46.74% |
| misa77 0.6.0 -0 | 157 MB/s | 3907 MB/s | 44.60% |
| misa77 0.6.0 -1 | 50.4 MB/s | 4101 MB/s | 42.64% |
| lizard 2.1 -10 | 433 MB/s | 2965 MB/s | 48.78% |
| zstd 1.5.7 -1 | 345 MB/s | 1135 MB/s | 34.53% |
| zstd 1.5.7 --fast=1 | 397 MB/s | 1405 MB/s | 41.01% |
| sylz -1 | 402 MB/s | 2930 MB/s | 44.62% |
| sylz -2 | 76 MB/s | 2930 MB/s | 41.05% |
| sylz -9 | 22.5 MB/s | 3150 MB/s | 36.88% |
| codec | compress | decompress | ratio |
|---|---|---|---|
| lz4hc -9 | 27.9 MB/s | 2977 MB/s | 36.75% |
| lz4hc -12 | 8.98 MB/s | 2889 MB/s | 36.45% |
| misa77 -3 | 10.3 MB/s | 3517 MB/s | 37.76% |
| lizard -19 | 3.61 MB/s | 2720 MB/s | 36.52% |
| compress | decompress | |
|---|---|---|
| level 1, x86-64 assembler | 402 MB/s | 2930 MB/s |
| level 1, Pascal | 262 MB/s | 2303 MB/s |
| level 9, assembler decoder | — | 3150 MB/s |
| level 9, Pascal | — | 2456 MB/s |
| entries | compress | ratio |
|---|---|---|
| 2^12 | 281 MB/s | 47.70% |
| 2^13 | 264 MB/s | 45.78% |
| 2^14 (used) | 236 MB/s | 44.69% |
| 2^15 | 207 MB/s | 44.08% |
| 2^16 | 194 MB/s | 43.74% |
(Pascal compressor, before the assembler.) At lz4's table size the ratio matches lz4's.
v0: 830 MB/s (pointers on the stack) → 2031 (call-free fast loop) → 2095 (smaller live set). v1: 1834 (lengths passed by var) → 2210 (extensions inline) → 2458 (limits in a record) → 3100 (assembler) → 3150 (counted mode). What each step means: Free Pascal codegen notes.