Bitruvius Imagery & 3D Suite / TurboZstd Drop-in for libzstd Shipping · Private Beta

Same zstd files. Faster to read at every level.

Zstandard is the compression inside GeoTIFFs, Zarr stores, databases and backups. TurboZstd reads and writes the same files as the reference libzstd, byte-for-byte standard RFC 8878 zstd, in memory-safe code with no C toolchain to build.

It exports the same ZSTD_* functions GDAL, libtiff, rasterio, Zarr, Python zstandard and Java zstd-jni call. Replace the system libzstd library; no recompile.

1.73–2.07×
faster to read, at every level
On Intel. 1.18×–1.49× on Apple silicon. Data is read far more often than it is written.
3.65×
faster archival writes, one core
At level 22 (1.79× at level 19), for files 2.6–2.7% larger.
19.4×
faster archival writes, every core
Against libzstd's own multi-threaded encoder at level 22, eight threads each. 17.6× on Apple silicon.
0
failures reading our files with libzstd
All 804 samples round-trip through the reference libzstd, on both chips, one thread and many.

The trade, up front: on one thread we write slower than libzstd at levels 1 and 3, and file size depends on your data type. Every figure is below.

The 60-second version

Zstandard is everywhere data is stored, and it is read far more than it is written.

The format

Zstandard

General-purpose compression with an open specification (RFC 8878). It sits inside imagery files, array stores, databases, logs and backups.

The incumbent

libzstd

The C reference library, linked by nearly everything that speaks zstd. It is the bar any replacement has to clear, on the same data.

The bill

Reads add up

Data is compressed once and decompressed every time it is used, so read speed is the number most systems feel, and archival writes are the big batch jobs.

The fix

A memory-safe drop-in

TurboZstd writes standard zstd that libzstd reads, reads everything libzstd writes, and replaces the library without a recompile.

What it means for the bill

Faster reads. Archives in minutes.

The Intel figures, translated.

42%
less time reading compressed data
At the slowest of the measured levels; more at the rest.
2.7 hours
for a 10-hour archival job, one core
At level 22, for files 2.6–2.7% larger.
31 minutes
for the same job on every core
Against libzstd's own parallel encoder, eight threads each.

Illustrative, from the measured Intel figures. A pilot measures yours.

The trade, stated

Where we win, and where libzstd still does.

We win

  • - Reading, at every level, on both chips.
  • - Writing from level 5 up on one thread (1.54× at level 5, 2.01× at level 9), and from level 3 up on every core on Intel.
  • - Size at the everyday levels: 5.2% smaller at level 1 and 2.4% at level 9; terrain models 16.6% and radar 11.3% smaller at level 1.

libzstd wins

  • - Writing at levels 1 and 3 on one thread, and level 1 on every core (0.99× Intel, 0.57× Apple silicon).
  • - Size at the archival levels, by 2.6–2.7%, where its deeper search still pays.
  • - Size on two data types at every level: optical imagery by up to 13.7% and AI inference masks by up to 8.9%.
  • - Reading two data types at level 1 on Apple silicon (hyperspectral 0.92×, radar quicklooks 0.91×).

One thread, every level

Reads faster at every level. Archival writes 1.8–3.6× faster.

One thread each against libzstd across the 804-sample corpus. Writing is slower than libzstd at levels 1 and 3, which already take microseconds, then pulls ahead at level 5 and wins 1.8× at level 19 and 3.6× at level 22. Reading wins at every level on both chips: 1.73× to 2.07× on Intel, 1.18× to 1.49× on Apple silicon.

Speed vs libzstd by compression level

Encode · AVX2 Encode · NEON Decode · AVX2 Decode · NEON — — 1× parity with libzstd
0.50×0.70×1.00×1.50×2.00×3.00×Speed multiplierL1L3L5L9L19L22Compression level1×0.70×0.89×1.54×2.01×1.79×3.65×

Log scale so the full range fits, from under 1× at level 1-3 writes to several-fold at level 22. Dashed = Apple silicon (NEON); solid = Intel (AVX2).

Every core

Faster than libzstd's own parallel encoder from level 3 on Intel and level 5 on Apple silicon.

Intel reaches 19.4× at level 22 and Apple silicon 17.6×. At level 1 both still trail libzstd's own multi-threaded encoder (0.99× and 0.57×). Level 9 on every core runs 3.1× faster on Apple silicon, at 2% smaller output. libzstd barely speeds up on archival work; at level 22 most raster types run 10× to 16× faster on Apple silicon, and video radar reaches 26×.

All-cores encode throughput vs libzstd (8 threads each)

Encode · AVX2 (par) Encode · NEON (par) — — 1× parity with libzstd
0.50×0.70×1.00×1.50×2.00×3.00×5.00×7.00×10.0×Speed × libzstd, all coresL1L3L5L9L19L22Compression level1×0.99×1.39×2.50×4.31×6.37×19.4×

encode_all_par against libzstd's own multi-threaded encoder, eight threads each, across the full 804-sample corpus. Both chips at 0c15e125 (v1.1.0). No interop failures. Log scale; dashed = Apple silicon, solid = Intel. Parallel is encode-only.

Fast levels

The speed-first levels read up to 2.5× faster.

TurboZstd supports libzstd's full negative range (-1 … -131072), a speed-first tier that gives up a little compression. Reading wins on both chips and writing clears parity on both: Intel reads 2.11× to 2.49× faster and Apple silicon 1.34× to 1.68×. Results vary widely by data type, from 0.73× on radar at level -3 to 4.42× on radar quicklooks at -5. Files stay within 1.2% of libzstd overall, but optical imagery runs 22.8% larger at -5.

Negative-level throughput vs libzstd (single-thread)

Decode · AVX2 Decode · NEON — — 1× parity with libzstd
1.00×1.50×2.00×Speed multiplier-1-3-5Compression level1×2.11×2.21×2.49×

Single-thread decode, the full 804-sample corpus, weighted by bytes, measured at 0c15e125 (v1.1.0) on both chips. Levels -7 and -19 are not charted; neither board measures them. No interop failures on either.

Your data type

Your data type. Your win column.

Size and speed against libzstd for each data type we benchmark, Intel (Arrow Lake) and Apple silicon (M3 Max) side by side. The all-cores bars run our parallel encoder against libzstd's own at the same thread count. Above 1× = TurboZstd faster. Positive size = TurboZstd smaller. At level 22 on every core, data types run 4.5× to 26× faster; on one thread the best are AI masks 9.27×, video radar 5.76× and terrain 2.82×.

AI Inference

Model inference output tensors (asphalt, vegetation, etc.)

228.4 MiB corpus

AVX2 · single-thread AVX2 · multi-thread NEON · single-thread NEON · multi-thread — — 1× / 0% parity with libzstd
ENCODE · TurboZstd speedup × libzstd0.00×5.00×10.0×15.0×AVX2 · single-threadL1: 0.76× encodeAVX2 · multi-threadL1: 1.83× encodeNEON · single-threadL1: 0.66× encodeNEON · multi-threadL1: 0.99× encodeL1AVX2 · single-threadL3: 0.67× encodeAVX2 · multi-threadL3: 1.61× encodeNEON · single-threadL3: 0.51× encodeNEON · multi-threadL3: 0.94× encodeL3AVX2 · single-threadL5: 1.45× encodeAVX2 · multi-threadL5: 2.93× encodeNEON · single-threadL5: 1.18× encodeNEON · multi-threadL5: 2.11× encodeL5AVX2 · single-threadL9: 1.14× encodeAVX2 · multi-threadL9: 2.30× encodeNEON · single-threadL9: 0.81× encodeNEON · multi-threadL9: 1.52× encodeL9AVX2 · single-threadL19: 1.65× encodeAVX2 · multi-threadL19: 3.19× encodeNEON · single-threadL19: 1.16× encodeNEON · multi-threadL19: 2.20× encodeL19AVX2 · single-threadL22: 9.27× encodeAVX2 · multi-threadL22: 18.4× encodeNEON · single-threadL22: 4.20× encodeNEON · multi-threadL22: 7.97× encodeL22DECODE · TurboZstd speedup × libzstd0.00×5.00×10.0×15.0×AVX2 · single-threadL1: 1.80× decodeNEON · single-threadL1: 1.34× decodeL1AVX2 · single-threadL3: 2.00× decodeNEON · single-threadL3: 1.48× decodeL3AVX2 · single-threadL5: 2.01× decodeNEON · single-threadL5: 1.54× decodeL5AVX2 · single-threadL9: 2.20× decodeNEON · single-threadL9: 1.41× decodeL9AVX2 · single-threadL19: 2.59× decodeNEON · single-threadL19: 1.93× decodeL19AVX2 · single-threadL22: 2.48× decodeNEON · single-threadL22: 1.84× decodeL22SIZE · TurboZstd vs libzstd (positive = smaller, win)-10.0%0.0%+10.0%AVX2 · single-threadL1: -2.6% smallerAVX2 · multi-threadL1: +3.2% smallerNEON · single-threadL1: -2.6% smallerNEON · multi-threadL1: +3.1% smallerL1AVX2 · single-threadL3: -2.1% smallerAVX2 · multi-threadL3: -2.1% smallerNEON · single-threadL3: -2.1% smallerNEON · multi-threadL3: -2.2% smallerL3AVX2 · single-threadL5: -8.4% smallerAVX2 · multi-threadL5: -8.4% smallerNEON · single-threadL5: -8.4% smallerNEON · multi-threadL5: -8.6% smallerL5AVX2 · single-threadL9: -4.5% smallerAVX2 · multi-threadL9: -4.5% smallerNEON · single-threadL9: -4.5% smallerNEON · multi-threadL9: -5.9% smallerL9AVX2 · single-threadL19: -8.9% smallerAVX2 · multi-threadL19: -8.9% smallerNEON · single-threadL19: -8.9% smallerNEON · multi-threadL19: -15.4% smallerL19AVX2 · single-threadL22: -8.9% smallerAVX2 · multi-threadL22: -8.9% smallerNEON · single-threadL22: -8.9% smallerNEON · multi-threadL22: -16.1% smallerL22

Digital Surface Models

LiDAR-derived terrain elevation grids

573.8 MiB corpus

AVX2 · single-thread AVX2 · multi-thread NEON · single-thread NEON · multi-thread — — 1× / 0% parity with libzstd
ENCODE · TurboZstd speedup × libzstd0.00×5.00×10.0×15.0×AVX2 · single-threadL1: 0.78× encodeAVX2 · multi-threadL1: 1.33× encodeNEON · single-threadL1: 0.66× encodeNEON · multi-threadL1: 0.79× encodeL1AVX2 · single-threadL3: 0.72× encodeAVX2 · multi-threadL3: 1.67× encodeNEON · single-threadL3: 0.52× encodeNEON · multi-threadL3: 1.14× encodeL3AVX2 · single-threadL5: 1.24× encodeAVX2 · multi-threadL5: 2.84× encodeNEON · single-threadL5: 0.98× encodeNEON · multi-threadL5: 2.41× encodeL5AVX2 · single-threadL9: 1.12× encodeAVX2 · multi-threadL9: 4.07× encodeNEON · single-threadL9: 0.76× encodeNEON · multi-threadL9: 2.74× encodeL9AVX2 · single-threadL19: 1.46× encodeAVX2 · multi-threadL19: 7.57× encodeNEON · single-threadL19: 1.49× encodeNEON · multi-threadL19: 7.49× encodeL19AVX2 · single-threadL22: 2.82× encodeAVX2 · multi-threadL22: 15.4× encodeNEON · single-threadL22: 2.17× encodeNEON · multi-threadL22: 11.5× encodeL22DECODE · TurboZstd speedup × libzstd0.00×5.00×10.0×15.0×AVX2 · single-threadL1: 1.14× decodeNEON · single-threadL1: 1.12× decodeL1AVX2 · single-threadL3: 1.32× decodeNEON · single-threadL3: 1.22× decodeL3AVX2 · single-threadL5: 1.39× decodeNEON · single-threadL5: 1.26× decodeL5AVX2 · single-threadL9: 1.43× decodeNEON · single-threadL9: 1.29× decodeL9AVX2 · single-threadL19: 1.75× decodeNEON · single-threadL19: 1.83× decodeL19AVX2 · single-threadL22: 1.79× decodeNEON · single-threadL22: 1.78× decodeL22SIZE · TurboZstd vs libzstd (positive = smaller, win)-10.0%0.0%+10.0%AVX2 · single-threadL1: +16.6% smallerAVX2 · multi-threadL1: +16.6% smallerNEON · single-threadL1: +16.6% smallerNEON · multi-threadL1: +16.5% smallerL1AVX2 · single-threadL3: -0.7% smallerAVX2 · multi-threadL3: -0.8% smallerNEON · single-threadL3: -0.7% smallerNEON · multi-threadL3: -0.8% smallerL3AVX2 · single-threadL5: -1.1% smallerAVX2 · multi-threadL5: -1.1% smallerNEON · single-threadL5: -1.1% smallerNEON · multi-threadL5: -1.1% smallerL5AVX2 · single-threadL9: -1.4% smallerAVX2 · multi-threadL9: -1.5% smallerNEON · single-threadL9: -1.4% smallerNEON · multi-threadL9: -1.6% smallerL9AVX2 · single-threadL19: -4.4% smallerAVX2 · multi-threadL19: -4.4% smallerNEON · single-threadL19: -4.4% smallerNEON · multi-threadL19: -7.1% smallerL19AVX2 · single-threadL22: -5.1% smallerAVX2 · multi-threadL22: -5.1% smallerNEON · single-threadL22: -5.1% smallerNEON · multi-threadL22: -7.2% smallerL22

Hyperspectral Imagery

100+ narrow spectral bands per pixel

892.5 MiB corpus

AVX2 · single-thread AVX2 · multi-thread NEON · single-thread NEON · multi-thread — — 1× / 0% parity with libzstd
ENCODE · TurboZstd speedup × libzstd0.00×5.00×10.0×AVX2 · single-threadL1: 0.53× encodeAVX2 · multi-threadL1: 0.92× encodeNEON · single-threadL1: 0.47× encodeNEON · multi-threadL1: 0.65× encodeL1AVX2 · single-threadL3: 0.77× encodeAVX2 · multi-threadL3: 1.74× encodeNEON · single-threadL3: 0.62× encodeNEON · multi-threadL3: 1.49× encodeL3AVX2 · single-threadL5: 1.29× encodeAVX2 · multi-threadL5: 2.90× encodeNEON · single-threadL5: 1.01× encodeNEON · multi-threadL5: 2.39× encodeL5AVX2 · single-threadL9: 1.95× encodeAVX2 · multi-threadL9: 3.94× encodeNEON · single-threadL9: 1.46× encodeNEON · multi-threadL9: 3.07× encodeL9AVX2 · single-threadL19: 1.14× encodeAVX2 · multi-threadL19: 8.65× encodeNEON · single-threadL19: 1.18× encodeNEON · multi-threadL19: 9.43× encodeL19AVX2 · single-threadL22: 1.61× encodeAVX2 · multi-threadL22: 11.6× encodeNEON · single-threadL22: 1.56× encodeNEON · multi-threadL22: 12.1× encodeL22DECODE · TurboZstd speedup × libzstd0.00×5.00×10.0×AVX2 · single-threadL1: 1.42× decodeNEON · single-threadL1: 0.92× decodeL1AVX2 · single-threadL3: 1.70× decodeNEON · single-threadL3: 1.52× decodeL3AVX2 · single-threadL5: 1.80× decodeNEON · single-threadL5: 1.69× decodeL5AVX2 · single-threadL9: 1.88× decodeNEON · single-threadL9: 1.68× decodeL9AVX2 · single-threadL19: 2.01× decodeNEON · single-threadL19: 1.86× decodeL19AVX2 · single-threadL22: 2.09× decodeNEON · single-threadL22: 1.80× decodeL22SIZE · TurboZstd vs libzstd (positive = smaller, win)-5.0%0.0%+5.0%AVX2 · single-threadL1: +2.6% smallerAVX2 · multi-threadL1: +3.7% smallerNEON · single-threadL1: +2.6% smallerNEON · multi-threadL1: +3.7% smallerL1AVX2 · single-threadL3: +1.4% smallerAVX2 · multi-threadL3: +1.1% smallerNEON · single-threadL3: +1.4% smallerNEON · multi-threadL3: +1.1% smallerL3AVX2 · single-threadL5: -2.7% smallerAVX2 · multi-threadL5: -2.9% smallerNEON · single-threadL5: -2.7% smallerNEON · multi-threadL5: -2.9% smallerL5AVX2 · single-threadL9: -4.0% smallerAVX2 · multi-threadL9: -4.3% smallerNEON · single-threadL9: -4.0% smallerNEON · multi-threadL9: -4.4% smallerL9AVX2 · single-threadL19: -2.3% smallerAVX2 · multi-threadL19: -2.5% smallerNEON · single-threadL19: -2.3% smallerNEON · multi-threadL19: -8.1% smallerL19AVX2 · single-threadL22: -2.3% smallerAVX2 · multi-threadL22: -2.5% smallerNEON · single-threadL22: -2.3% smallerNEON · multi-threadL22: -8.2% smallerL22

Multispectral Imagery

Landsat / Sentinel-2 multi-band raster

552.5 MiB corpus

AVX2 · single-thread AVX2 · multi-thread NEON · single-thread NEON · multi-thread — — 1× / 0% parity with libzstd
ENCODE · TurboZstd speedup × libzstd0.00×5.00×10.0×15.0×AVX2 · single-threadL1: 0.57× encodeAVX2 · multi-threadL1: 1.16× encodeNEON · single-threadL1: 0.46× encodeNEON · multi-threadL1: 0.59× encodeL1AVX2 · single-threadL3: 0.78× encodeAVX2 · multi-threadL3: 1.61× encodeNEON · single-threadL3: 0.58× encodeNEON · multi-threadL3: 1.16× encodeL3AVX2 · single-threadL5: 1.34× encodeAVX2 · multi-threadL5: 2.69× encodeNEON · single-threadL5: 1.05× encodeNEON · multi-threadL5: 2.14× encodeL5AVX2 · single-threadL9: 2.12× encodeAVX2 · multi-threadL9: 4.14× encodeNEON · single-threadL9: 1.55× encodeNEON · multi-threadL9: 2.57× encodeL9AVX2 · single-threadL19: 1.25× encodeAVX2 · multi-threadL19: 8.88× encodeNEON · single-threadL19: 1.22× encodeNEON · multi-threadL19: 9.48× encodeL19AVX2 · single-threadL22: 2.50× encodeAVX2 · multi-threadL22: 17.5× encodeNEON · single-threadL22: 2.17× encodeNEON · multi-threadL22: 16.2× encodeL22DECODE · TurboZstd speedup × libzstd0.00×5.00×10.0×15.0×AVX2 · single-threadL1: 1.71× decodeNEON · single-threadL1: 1.05× decodeL1AVX2 · single-threadL3: 1.83× decodeNEON · single-threadL3: 1.45× decodeL3AVX2 · single-threadL5: 1.96× decodeNEON · single-threadL5: 1.65× decodeL5AVX2 · single-threadL9: 2.14× decodeNEON · single-threadL9: 1.63× decodeL9AVX2 · single-threadL19: 2.09× decodeNEON · single-threadL19: 1.93× decodeL19AVX2 · single-threadL22: 2.29× decodeNEON · single-threadL22: 1.88× decodeL22SIZE · TurboZstd vs libzstd (positive = smaller, win)-5.0%0.0%+5.0%AVX2 · single-threadL1: +1.3% smallerAVX2 · multi-threadL1: +1.5% smallerNEON · single-threadL1: +1.3% smallerNEON · multi-threadL1: +1.5% smallerL1AVX2 · single-threadL3: +1.1% smallerAVX2 · multi-threadL3: +0.8% smallerNEON · single-threadL3: +1.1% smallerNEON · multi-threadL3: +0.8% smallerL3AVX2 · single-threadL5: -2.1% smallerAVX2 · multi-threadL5: -2.5% smallerNEON · single-threadL5: -2.1% smallerNEON · multi-threadL5: -2.5% smallerL5AVX2 · single-threadL9: -3.5% smallerAVX2 · multi-threadL9: -3.8% smallerNEON · single-threadL9: -3.5% smallerNEON · multi-threadL9: -3.9% smallerL9AVX2 · single-threadL19: -1.1% smallerAVX2 · multi-threadL19: -1.3% smallerNEON · single-threadL19: -1.1% smallerNEON · multi-threadL19: -5.1% smallerL19AVX2 · single-threadL22: -1.4% smallerAVX2 · multi-threadL22: -1.6% smallerNEON · single-threadL22: -1.4% smallerNEON · multi-threadL22: -5.3% smallerL22

Optical Imagery

RGB satellite + aerial photography (DOQQ, NAIP)

297.5 MiB corpus

AVX2 · single-thread AVX2 · multi-thread NEON · single-thread NEON · multi-thread — — 1× / 0% parity with libzstd
ENCODE · TurboZstd speedup × libzstd0.00×5.00×10.0×15.0×AVX2 · single-threadL1: 0.67× encodeAVX2 · multi-threadL1: 1.17× encodeNEON · single-threadL1: 0.66× encodeNEON · multi-threadL1: 0.83× encodeL1AVX2 · single-threadL3: 0.68× encodeAVX2 · multi-threadL3: 1.70× encodeNEON · single-threadL3: 0.56× encodeNEON · multi-threadL3: 1.42× encodeL3AVX2 · single-threadL5: 1.27× encodeAVX2 · multi-threadL5: 3.24× encodeNEON · single-threadL5: 1.08× encodeNEON · multi-threadL5: 2.82× encodeL5AVX2 · single-threadL9: 0.85× encodeAVX2 · multi-threadL9: 3.52× encodeNEON · single-threadL9: 0.69× encodeNEON · multi-threadL9: 2.94× encodeL9AVX2 · single-threadL19: 1.44× encodeAVX2 · multi-threadL19: 10.1× encodeNEON · single-threadL19: 1.24× encodeNEON · multi-threadL19: 8.31× encodeL19AVX2 · single-threadL22: 2.09× encodeAVX2 · multi-threadL22: 14.3× encodeNEON · single-threadL22: 1.56× encodeNEON · multi-threadL22: 10.1× encodeL22DECODE · TurboZstd speedup × libzstd0.00×5.00×10.0×15.0×AVX2 · single-threadL1: 1.54× decodeNEON · single-threadL1: 1.21× decodeL1AVX2 · single-threadL3: 1.75× decodeNEON · single-threadL3: 1.44× decodeL3AVX2 · single-threadL5: 1.81× decodeNEON · single-threadL5: 1.54× decodeL5AVX2 · single-threadL9: 1.83× decodeNEON · single-threadL9: 1.38× decodeL9AVX2 · single-threadL19: 2.33× decodeNEON · single-threadL19: 2.09× decodeL19AVX2 · single-threadL22: 2.37× decodeNEON · single-threadL22: 1.99× decodeL22SIZE · TurboZstd vs libzstd (positive = smaller, win)-20.0%-10.0%0.0%+10.0%+20.0%AVX2 · single-threadL1: -4.9% smallerAVX2 · multi-threadL1: -4.2% smallerNEON · single-threadL1: -4.9% smallerNEON · multi-threadL1: -4.4% smallerL1AVX2 · single-threadL3: -3.0% smallerAVX2 · multi-threadL3: -3.0% smallerNEON · single-threadL3: -3.0% smallerNEON · multi-threadL3: -3.3% smallerL3AVX2 · single-threadL5: -13.7% smallerAVX2 · multi-threadL5: -13.7% smallerNEON · single-threadL5: -13.7% smallerNEON · multi-threadL5: -13.9% smallerL5AVX2 · single-threadL9: -8.0% smallerAVX2 · multi-threadL9: -8.0% smallerNEON · single-threadL9: -8.0% smallerNEON · multi-threadL9: -9.5% smallerL9AVX2 · single-threadL19: -7.7% smallerAVX2 · multi-threadL19: -7.7% smallerNEON · single-threadL19: -7.7% smallerNEON · multi-threadL19: -17.2% smallerL19AVX2 · single-threadL22: -7.0% smallerAVX2 · multi-threadL22: -7.0% smallerNEON · single-threadL22: -7.0% smallerNEON · multi-threadL22: -18.1% smallerL22

RGB Orthoimagery

High-resolution ortho-rectified RGB tiles

430.3 MiB corpus

AVX2 · single-thread AVX2 · multi-thread NEON · single-thread NEON · multi-thread — — 1× / 0% parity with libzstd
ENCODE · TurboZstd speedup × libzstd0.00×5.00×10.0×AVX2 · single-threadL1: 0.64× encodeAVX2 · multi-threadL1: 1.20× encodeNEON · single-threadL1: 0.41× encodeNEON · multi-threadL1: 0.62× encodeL1AVX2 · single-threadL3: 0.89× encodeAVX2 · multi-threadL3: 1.91× encodeNEON · single-threadL3: 0.49× encodeNEON · multi-threadL3: 1.24× encodeL3AVX2 · single-threadL5: 1.76× encodeAVX2 · multi-threadL5: 4.18× encodeNEON · single-threadL5: 1.19× encodeNEON · multi-threadL5: 3.15× encodeL5AVX2 · single-threadL9: 0.95× encodeAVX2 · multi-threadL9: 3.77× encodeNEON · single-threadL9: 0.58× encodeNEON · multi-threadL9: 2.44× encodeL9AVX2 · single-threadL19: 1.28× encodeAVX2 · multi-threadL19: 8.68× encodeNEON · single-threadL19: 1.39× encodeNEON · multi-threadL19: 9.64× encodeL19AVX2 · single-threadL22: 1.81× encodeAVX2 · multi-threadL22: 11.6× encodeNEON · single-threadL22: 1.70× encodeNEON · multi-threadL22: 10.9× encodeL22DECODE · TurboZstd speedup × libzstd0.00×5.00×10.0×AVX2 · single-threadL1: 1.73× decodeNEON · single-threadL1: 1.18× decodeL1AVX2 · single-threadL3: 1.83× decodeNEON · single-threadL3: 1.14× decodeL3AVX2 · single-threadL5: 1.94× decodeNEON · single-threadL5: 1.30× decodeL5AVX2 · single-threadL9: 1.86× decodeNEON · single-threadL9: 1.19× decodeL9AVX2 · single-threadL19: 2.19× decodeNEON · single-threadL19: 2.06× decodeL19AVX2 · single-threadL22: 2.08× decodeNEON · single-threadL22: 1.79× decodeL22SIZE · TurboZstd vs libzstd (positive = smaller, win)-5.0%0.0%+5.0%AVX2 · single-threadL1: +0.3% smallerAVX2 · multi-threadL1: +1.1% smallerNEON · single-threadL1: +0.3% smallerNEON · multi-threadL1: +1.1% smallerL1AVX2 · single-threadL3: +0.2% smallerAVX2 · multi-threadL3: +0.1% smallerNEON · single-threadL3: +0.2% smallerNEON · multi-threadL3: +0.1% smallerL3AVX2 · single-threadL5: -1.7% smallerAVX2 · multi-threadL5: -1.8% smallerNEON · single-threadL5: -1.7% smallerNEON · multi-threadL5: -1.8% smallerL5AVX2 · single-threadL9: 0.0% smallerAVX2 · multi-threadL9: 0.0% smallerNEON · single-threadL9: 0.0% smallerNEON · multi-threadL9: -0.1% smallerL9AVX2 · single-threadL19: -3.0% smallerAVX2 · multi-threadL19: -3.0% smallerNEON · single-threadL19: -3.0% smallerNEON · multi-threadL19: -6.4% smallerL19AVX2 · single-threadL22: -2.4% smallerAVX2 · multi-threadL22: -2.4% smallerNEON · single-threadL22: -2.4% smallerNEON · multi-threadL22: -6.4% smallerL22

SAR CSI SLEDP

Synthetic-aperture radar complex single-look data

510.0 MiB corpus

AVX2 · single-thread AVX2 · multi-thread NEON · single-thread NEON · multi-thread — — 1× / 0% parity with libzstd
ENCODE · TurboZstd speedup × libzstd0.00×5.00×10.0×AVX2 · single-threadL1: 0.84× encodeAVX2 · multi-threadL1: 1.06× encodeNEON · single-threadL1: 0.66× encodeNEON · multi-threadL1: 0.82× encodeL1AVX2 · single-threadL3: 0.72× encodeAVX2 · multi-threadL3: 1.32× encodeNEON · single-threadL3: 0.51× encodeNEON · multi-threadL3: 1.10× encodeL3AVX2 · single-threadL5: 1.23× encodeAVX2 · multi-threadL5: 2.27× encodeNEON · single-threadL5: 0.93× encodeNEON · multi-threadL5: 2.34× encodeL5AVX2 · single-threadL9: 3.71× encodeAVX2 · multi-threadL9: 8.81× encodeNEON · single-threadL9: 2.49× encodeNEON · multi-threadL9: 9.01× encodeL9AVX2 · single-threadL19: 2.64× encodeAVX2 · multi-threadL19: 9.11× encodeNEON · single-threadL19: 2.47× encodeNEON · multi-threadL19: 11.4× encodeL19AVX2 · single-threadL22: 2.94× encodeAVX2 · multi-threadL22: 9.93× encodeNEON · single-threadL22: 2.45× encodeNEON · multi-threadL22: 11.0× encodeL22DECODE · TurboZstd speedup × libzstd0.00×5.00×10.0×AVX2 · single-threadL1: 1.71× decodeNEON · single-threadL1: 1.31× decodeL1AVX2 · single-threadL3: 1.89× decodeNEON · single-threadL3: 1.37× decodeL3AVX2 · single-threadL5: 1.87× decodeNEON · single-threadL5: 1.39× decodeL5AVX2 · single-threadL9: 1.92× decodeNEON · single-threadL9: 1.38× decodeL9AVX2 · single-threadL19: 2.00× decodeNEON · single-threadL19: 1.40× decodeL19AVX2 · single-threadL22: 2.18× decodeNEON · single-threadL22: 1.42× decodeL22SIZE · TurboZstd vs libzstd (positive = smaller, win)-10.0%0.0%+10.0%AVX2 · single-threadL1: +11.3% smallerAVX2 · multi-threadL1: +11.5% smallerNEON · single-threadL1: +11.3% smallerNEON · multi-threadL1: +11.5% smallerL1AVX2 · single-threadL3: 0.0% smallerAVX2 · multi-threadL3: 0.0% smallerNEON · single-threadL3: 0.0% smallerNEON · multi-threadL3: 0.0% smallerL3AVX2 · single-threadL5: +0.1% smallerAVX2 · multi-threadL5: +0.1% smallerNEON · single-threadL5: +0.1% smallerNEON · multi-threadL5: +0.1% smallerL5AVX2 · single-threadL9: +0.5% smallerAVX2 · multi-threadL9: +0.4% smallerNEON · single-threadL9: +0.5% smallerNEON · multi-threadL9: +0.4% smallerL9AVX2 · single-threadL19: -0.5% smallerAVX2 · multi-threadL19: -0.5% smallerNEON · single-threadL19: -0.5% smallerNEON · multi-threadL19: -0.7% smallerL19AVX2 · single-threadL22: -0.5% smallerAVX2 · multi-threadL22: -0.5% smallerNEON · single-threadL22: -0.5% smallerNEON · multi-threadL22: -1.2% smallerL22

SAR CSI Quicklook

SAR amplitude quicklooks for browse imagery

85.0 MiB corpus

AVX2 · single-thread AVX2 · multi-thread NEON · single-thread NEON · multi-thread — — 1× / 0% parity with libzstd
ENCODE · TurboZstd speedup × libzstd0.00×2.00×4.00×6.00×8.00×AVX2 · single-threadL1: 0.55× encodeAVX2 · multi-threadL1: 1.16× encodeNEON · single-threadL1: 0.34× encodeNEON · multi-threadL1: 0.54× encodeL1AVX2 · single-threadL3: 0.64× encodeAVX2 · multi-threadL3: 1.34× encodeNEON · single-threadL3: 0.43× encodeNEON · multi-threadL3: 0.81× encodeL3AVX2 · single-threadL5: 1.25× encodeAVX2 · multi-threadL5: 2.51× encodeNEON · single-threadL5: 0.89× encodeNEON · multi-threadL5: 1.76× encodeL5AVX2 · single-threadL9: 0.91× encodeAVX2 · multi-threadL9: 1.97× encodeNEON · single-threadL9: 0.60× encodeNEON · multi-threadL9: 1.23× encodeL9AVX2 · single-threadL19: 0.94× encodeAVX2 · multi-threadL19: 3.21× encodeNEON · single-threadL19: 0.84× encodeNEON · multi-threadL19: 2.75× encodeL19AVX2 · single-threadL22: 2.29× encodeAVX2 · multi-threadL22: 7.74× encodeNEON · single-threadL22: 1.42× encodeNEON · multi-threadL22: 4.53× encodeL22DECODE · TurboZstd speedup × libzstd0.00×2.00×4.00×6.00×8.00×AVX2 · single-threadL1: 1.37× decodeNEON · single-threadL1: 0.91× decodeL1AVX2 · single-threadL3: 1.74× decodeNEON · single-threadL3: 1.15× decodeL3AVX2 · single-threadL5: 1.95× decodeNEON · single-threadL5: 1.32× decodeL5AVX2 · single-threadL9: 1.90× decodeNEON · single-threadL9: 1.24× decodeL9AVX2 · single-threadL19: 1.76× decodeNEON · single-threadL19: 1.71× decodeL19AVX2 · single-threadL22: 1.69× decodeNEON · single-threadL22: 1.65× decodeL22SIZE · TurboZstd vs libzstd (positive = smaller, win)-5.0%0.0%+5.0%AVX2 · single-threadL1: +0.3% smallerAVX2 · multi-threadL1: -2.2% smallerNEON · single-threadL1: +0.3% smallerNEON · multi-threadL1: -2.2% smallerL1AVX2 · single-threadL3: -0.4% smallerAVX2 · multi-threadL3: -3.0% smallerNEON · single-threadL3: -0.4% smallerNEON · multi-threadL3: -3.0% smallerL3AVX2 · single-threadL5: -2.2% smallerAVX2 · multi-threadL5: -4.8% smallerNEON · single-threadL5: -2.2% smallerNEON · multi-threadL5: -4.8% smallerL5AVX2 · single-threadL9: -2.1% smallerAVX2 · multi-threadL9: -3.5% smallerNEON · single-threadL9: -2.1% smallerNEON · multi-threadL9: -3.8% smallerL9AVX2 · single-threadL19: -0.4% smallerAVX2 · multi-threadL19: -0.5% smallerNEON · single-threadL19: -0.4% smallerNEON · multi-threadL19: -2.3% smallerL19AVX2 · single-threadL22: -0.4% smallerAVX2 · multi-threadL22: -0.5% smallerNEON · single-threadL22: -0.4% smallerNEON · multi-threadL22: -2.3% smallerL22

SAR VID SLEDP

Video synthetic-aperture radar frames

4515.6 MiB corpus

AVX2 · single-thread AVX2 · multi-thread NEON · single-thread NEON · multi-thread — — 1× / 0% parity with libzstd
ENCODE · TurboZstd speedup × libzstd0.00×10.0×20.0×AVX2 · single-threadL1: 0.75× encodeAVX2 · multi-threadL1: 0.77× encodeNEON · single-threadL1: 0.53× encodeNEON · multi-threadL1: 0.40× encodeL1AVX2 · single-threadL3: 1.07× encodeAVX2 · multi-threadL3: 0.95× encodeNEON · single-threadL3: 0.69× encodeNEON · multi-threadL3: 0.65× encodeL3AVX2 · single-threadL5: 1.80× encodeAVX2 · multi-threadL5: 1.76× encodeNEON · single-threadL5: 1.23× encodeNEON · multi-threadL5: 1.38× encodeL5AVX2 · single-threadL9: 3.29× encodeAVX2 · multi-threadL9: 5.61× encodeNEON · single-threadL9: 2.07× encodeNEON · multi-threadL9: 3.86× encodeL9AVX2 · single-threadL19: 2.48× encodeAVX2 · multi-threadL19: 4.46× encodeNEON · single-threadL19: 1.92× encodeNEON · multi-threadL19: 4.33× encodeL19AVX2 · single-threadL22: 5.76× encodeAVX2 · multi-threadL22: 26.8× encodeNEON · single-threadL22: 4.90× encodeNEON · multi-threadL22: 26.2× encodeL22DECODE · TurboZstd speedup × libzstd0.00×10.0×20.0×AVX2 · single-threadL1: 1.97× decodeNEON · single-threadL1: 1.25× decodeL1AVX2 · single-threadL3: 2.07× decodeNEON · single-threadL3: 1.37× decodeL3AVX2 · single-threadL5: 2.08× decodeNEON · single-threadL5: 1.42× decodeL5AVX2 · single-threadL9: 2.05× decodeNEON · single-threadL9: 1.35× decodeL9AVX2 · single-threadL19: 1.79× decodeNEON · single-threadL19: 1.23× decodeL19AVX2 · single-threadL22: 2.06× decodeNEON · single-threadL22: 1.30× decodeL22SIZE · TurboZstd vs libzstd (positive = smaller, win)-5.0%0.0%+5.0%AVX2 · single-threadL1: +5.2% smallerAVX2 · multi-threadL1: +5.3% smallerNEON · single-threadL1: +5.2% smallerNEON · multi-threadL1: +5.3% smallerL1AVX2 · single-threadL3: -1.4% smallerAVX2 · multi-threadL3: -1.4% smallerNEON · single-threadL3: -1.4% smallerNEON · multi-threadL3: -1.4% smallerL3AVX2 · single-threadL5: +0.3% smallerAVX2 · multi-threadL5: +0.3% smallerNEON · single-threadL5: +0.3% smallerNEON · multi-threadL5: +0.3% smallerL5AVX2 · single-threadL9: +5.0% smallerAVX2 · multi-threadL9: +4.9% smallerNEON · single-threadL9: +5.0% smallerNEON · multi-threadL9: +4.9% smallerL9AVX2 · single-threadL19: -2.7% smallerAVX2 · multi-threadL19: -2.7% smallerNEON · single-threadL19: -2.7% smallerNEON · multi-threadL19: -2.6% smallerL19AVX2 · single-threadL22: -2.8% smallerAVX2 · multi-threadL22: -2.8% smallerNEON · single-threadL22: -2.8% smallerNEON · multi-threadL22: -2.8% smallerL22

Drops into the pipeline

A library swap. Not a migration.

  • - Standard zstd. RFC 8878 frames, which obsoletes RFC 8478. Every one of the 804 samples we compress is read back by the reference libzstd, unchanged, on Intel and Apple silicon, one thread and many.
  • - Swap the library, keep the code. The same ZSTD_* functions GDAL, libtiff, rasterio, Zarr, Python zstandard and Java zstd-jni call. Replace the system library; no recompile.
  • - Memory-safe, with no C toolchain to build on developer workstations, CI runners or customer build farms.
  • - The same bytes on every chip. The same input and level produce identical output on Intel and Apple silicon, so dedup and cache keys stay stable.
  • - A clean licensing chain. TurboZstd is independent, written from RFC 8878 with no libzstd code.
  • - Real Niantic SPZ Gaussian-splat payloads compress at level 3 and round-trip byte-for-byte through the reference libzstd; TurboZstd is the compression inside TurboSPZ.
  • - SIMD backends: AVX2 and NEON, each benchmarked on its own native hardware.

How this was measured

  • Machines: Intel Arrow Lake (AVX2) and Apple M3 Max (NEON), each against libzstd 1.5.7 on the same machine. Same build on both (v1.1.0, 2026-09-16/17), but different machines, so the gap between them is not a chip result.
  • The Bitruvius corpus: 804 samples across 9 imagery data types, every one round-tripped through libzstd. Overall figures are weighted by bytes. Speed is TurboZstd's throughput divided by libzstd's.
  • "Every core" runs both libraries' parallel encoders at eight threads each. Parallel figures are for writing only.
  • Every figure on this page comes from a results board committed to the TurboZstd repository.

Bring five of your datasets.

A pilot runs both libraries on your own data, on your own machine, at the levels you use. You keep the numbers.

See pricing

TurboZstd is licensed through the Bitruvius Developer Hub and ships as compiled binaries.

References here to Zstandard, zstd and libzstd, and to GDAL, libtiff, rasterio, Zarr, Python zstandard, zstd-jni, and ruzstd, identify the products, formats, and ecosystems being compared or interoperated with; no affiliation, sponsorship, or endorsement is implied. libzstd is published under a dual BSD-3-Clause / GPLv2 license. The Zstandard frame format is openly specified in RFC 8878 (which obsoletes RFC 8478) and freely usable. TurboZstd is an independent implementation of that specification. Performance comparisons reflect our own measurements under the stated methodology; results vary by workload and hardware. Full third-party notices: Attributions.