LZ4: Extremely fast compression and decompression for C/C++ data streams
A lossless compressor for C/C++ and the CLI whose LZ4 decoder approaches memory speed instead of maximizing compression ratio.
GitHub lz4/lz4 Updated 2026-11-06 Branch dev Stars 12.4K Forks 1.6K
C C++ Lossless compression lz4 CLI Linux Makefile

🧭 Decision Guide

Try it if you

  • You need single-core compression above 500 MB/s in C/C++
    The README's LZ4 - Extremely fast compression section states compression speed > 500 MB/s per core
  • Your system prioritizes decompression throughput and targets about 4950 MB/s
    The README Benchmarks table reports 4950 MB/s decompression for LZ4 default v1.11.0
  • You need to process arbitrarily long files or data streams
    The README Documentation section says arbitrarily long files or data streams use multiple blocks organized into a frame
  • You need dictionary compression for small files and can use -D or lz4frame.h
    The README states that dictionary compression is supported at both API and CLI (-D) levels

Skip it if you

  • Your primary goal is a default compression ratio higher than LZ4's 2.112
    The README Benchmarks table shows Zstandard 1.5.7 -1 at 2.896 versus LZ4 default at 2.112
  • Your deployment environment cannot accept a CLI licensed under GPL-2.0-or-later
    The README explicitly states that the lz4 command line utility uses GPL-2.0-or-later
  • Your deployment environment cannot handle the root permissions that make install may require
    The README Installation section states that make install may require root permissions

Requirements

  • The README Installation section provides make and make install; make install may require root permissions.
  • The project uses a Makefile and supports parallel builds (-j#).
  • For C/C++ integration, the README provides the lz4.h, lz4hc.h, and lz4frame.h header APIs.

First step (verbatim from README)

make

Watch out

  • Choosing LZ4_HC -9 reduces compression speed to 40 MB/s.
    The README Benchmarks table reports 40 MB/s compression for LZ4 HC -9 v1.11.0
  • The CLI and library have different licenses; BSD 2-Clause does not directly apply to the lz4 command.
    The README separately states that the library uses BSD 2-Clause and the lz4 command line utility uses GPL-2.0-or-later
  • A dictionary may be any input file, but only its final 64 KB are actually used.
    The README explicitly states that only the final 64 KB are used
  • Interoperable implementations must follow lz4_Frame_format rather than handling only raw blocks.
    The README Documentation section states that interoperable versions of LZ4 must respect the frame format

Alternatives

  • Zstandard 1.5.7:Zstandard 1.5.7 -1 reaches a 2.896 compression ratio in the benchmark, higher than LZ4 default at 2.112; it is better when ratio matters more.
    README Benchmarks section
  • zlib 1.3.2:When zlib deflate format or a higher compression ratio is required, the README benchmark reports 3.106 for zlib deflate 1.3.2 -6.
    README Benchmarks section

Not stated in the README

  • The README does not specify supported operating-system versions or the exact Windows and macOS build requirements.
  • The README does not document LZ4_HC API parameters, memory usage, or thread-safety behavior.
  • The README does not provide the release date or changes for v1.11.0, nor establish a causal link with the current Trending growth.
  • Project metadata labels the license as Other, while the README lists BSD 2-Clause and GPL-2.0-or-later separately; the license boundary should be checked in the release files.

💡 Deep Analysis

6
No I need to transfer arbitrarily long streams between multiple C/C++ processes and have different implementations follow one format. Is the LZ4 block API sufficient, or should I use the frame API?
For: A C/C++ engineer maintaining cross-machine streams and long-file transfers who needs an interoperable format, multiple blocks, and complete stream boundaries rather than single-block compression only

No, using only the block API is not suitable; your cross-process long-stream case should prefer the frame API.

  • The README distinguishes the block format from the frame format and says arbitrarily long files or streams use multiple blocks.
  • Those blocks are organized into a frame, which provides the organization required for streaming data.
  • It explicitly says interoperable LZ4 implementations must respect the frame format, directly matching a cross-process and cross-machine interoperability requirement.
  • The API documentation maps lz4.h to the block API and lz4frame.h to the frame API.

The block API remains suitable when an existing protocol already manages block boundaries. The README does not say whether your transport supplies lengths, checksums, truncation detection, or dictionary identifiers, so it cannot establish that raw blocks are safe.

  • README, “Documentation”: “Arbitrarily long files or data streams are compressed using multiple blocks”
  • README, “Documentation”: “These blocks are organized into a frame”
  • README, “Documentation”: “Interoperable versions of LZ4 must also respect the frame format”
  • README, “Documentation”: “ [lz4.h] (block API)” and “ [lz4frame.h] (frame API)”
make
Not stated in the README:The README does not state whether the transport protocol already defines lengths, checksums, recovery, or truncation detection.;It does not state whether the target language implementations fully support the same frame version and optional metadata.
It depends I want to embed the LZ4 C library in a closed-source product and ship the `lz4` command-line tool with it. Does the difference between the BSD 2-Clause library license and GPL-2.0-or-later CLI license change this integration plan?
For: A release engineer embedding compression into a closed-source C product while also distributing the lz4 command-line tool and therefore needing to distinguish library and CLI licenses

It depends: embedding the BSD 2-Clause library is a different licensing case from shipping the GPL-2.0-or-later CLI, so they must not be treated as one license object.

  • The README explicitly says the LZ4 library uses the BSD 2-Clause license.
  • It separately states that the lz4 command-line utility uses the GPL-2.0-or-later license.
  • Project metadata labels the license as “Other,” so metadata alone is insufficient and the README’s library/CLI distinction matters.
  • The Packaging status section says most distributions package both liblz4 and the lz4 CLI, but distribution still requires treating them separately.

Embedding only the library is therefore a different compliance path from shipping the CLI. The README does not explain static versus dynamic linking, modified CLI distribution, combined products, or source-code obligations, so it cannot provide a final legal determination.

  • README, “LZ4 - Extremely fast compression”: “The LZ4 library is provided as open-source software using the BSD 2-Clause license”
  • README, “LZ4 - Extremely fast compression”: “The `lz4` command line utility is provided under the GPL-2.0-or-later license”
  • README, “Packaging status”: “Most distributions are bundled with a package manager”
  • Project data: license is “Other”
Not stated in the README:The README does not explain the specific compliance implications of static versus dynamic linking.;It does not explain distribution requirements after modifying the CLI, combined-distribution obligations, or source-code procedures for closed-source products.
Yes I am implementing cache write and read paths in C on Linux 64-bit servers. I need over 500 MB/s single-core compression and minimal decompression latency. Is LZ4 suitable?
For: An infrastructure engineer building C-based caches and data pipelines on Linux 64-bit servers, requiring over 500 MB/s single-core compression throughput and read latency close to memory speed

Yes, because LZ4 is specifically designed for high-throughput compression and extremely fast decompression.

  • The README states compression above 500 MB/s per core; its single-thread benchmark reaches 770 MB/s in default mode.
  • The same benchmark reports 4,950 MB/s decompression, and the README says multi-core performance commonly reaches RAM-speed limits.
  • The acceleration factor can trade compression ratio for higher write-side speed dynamically.
  • The project provides a C library plus block and frame APIs for memory blocks and continuous streams.

Actual end-to-end throughput may still be limited by memory bandwidth, copying, or downstream processing. The README does not specify your cache data distribution or concurrency model.

  • README, “LZ4 - Extremely fast compression”: “compression speed > 500 MB/s per core”
  • README, “Benchmarks”: “LZ4 default (v1.11.0) ... 770 MB/s ... 4950 MB/s”
  • README, “LZ4 - Extremely fast compression”: “Compression speed can be tuned dynamically”
  • README, “Documentation”: “The library API is documented in its headers”
make
Not stated in the README:The README does not specify the cache data compressibility, block size, memory bandwidth, or thread count.;The benchmark uses a Core i7-9700K, GCC v13.3.0, Ubuntu 24.04, and the Silesia Corpus, so it does not establish performance on the target hardware.
Yes For a C/C++ offline backup pipeline, I can accept compression around 40 MB/s with LZ4 HC -9. If readers must still decompress at multiple GB/s, is LZ4_HC suitable?
For: A C/C++ storage engineer responsible for offline backups and release packages who can accept compression near 40 MB/s but wants a higher ratio while retaining fast reads

Yes, provided that backup writing is not a real-time bottleneck; LZ4_HC concentrates the extra CPU cost on compression.

  • The README states that LZ4_HC trades CPU time for improved compression ratio while all versions retain the same decompression speed.
  • The benchmark reports about 40 MB/s compression and a 2.717 factor for LZ4 HC -9, versus 2.112 for default LZ4.
  • HC -9 decompresses at 4,800 MB/s, close to the default mode’s 4,950 MB/s.
  • The high-compression API is exposed through lz4hc.h, allowing direct C/C++ integration.

It is not suitable for an online path with very tight write latency. The README does not specify the backup data’s real compressibility, disk throughput, or resource curve for other HC levels.

  • README, “LZ4 - Extremely fast compression”: “LZ4_HC ... trading CPU time for improved compression ratio”
  • README, “Benchmarks”: “LZ4 HC -9 (v1.11.0) ... 40 MB/s ... 4800 MB/s”
  • README, “Benchmarks”: “LZ4 default (v1.11.0) ... 2.112 ... 770 MB/s ... 4950 MB/s”
  • README, “Documentation”: “[lz4hc.h] (high compression)”
make
Not stated in the README:The README does not provide the actual ratio or peak memory usage of LZ4_HC -9 on the target backup data.;It does not state whether the backup job can be queued offline or provide speed and ratio data for other HC levels.
Yes I need to integrate a C library into Linux Make builds, Windows Visual Studio projects, and projects using CMake, Meson, and vcpkg. Does LZ4 cover these build constraints?
For: A cross-platform component maintainer distributing a C library across Linux, Windows, and Visual Studio projects while the team uses Make, CMake, Meson, and vcpkg

Yes, the README explicitly lists these build paths, although the target distribution and ABI still need verification.

  • The core implementation is C; the README provides a Make installation flow and says the Makefile supports parallel builds, staged installs, and standard variable conventions.
  • It explicitly provides CMake, Meson, and Visual Studio build systems, covering common Linux and Windows project environments.
  • The vcpkg section gives ./vcpkg install lz4, which fits teams already using vcpkg for dependency management.
  • Project data identifies v1.11.0 as the latest release and reports five releases, so version and ABI compatibility still require separate checking.

The README does not specify generated library names, exported targets, compiler options, or ABI guarantees for each build system, nor whether the vcpkg port is synchronized with v1.11.0.

  • README, “Installation”: “make” and “make install”
  • README, “Installation”: “It is compatible with parallel builds (`-j#`)”
  • README, “Installation”: “Alternative build systems (CMake, Meson, Visual Studio) are provided”
  • README, “Building LZ4 - Using vcpkg”: “./vcpkg install lz4”
  • Project data: main_language is C; latest_release is v1.11.0; release_count is 5
make
Not stated in the README:The README does not list target names, installation paths, exported package configuration, or ABI guarantees for each build system.;It does not state whether the current vcpkg port matches the project’s latest release, v1.11.0.
Yes In a Python/C application processing many structurally similar small files and short messages, both sides can access the same dictionary. Is LZ4 dictionary compression suitable for improving default compression?
For: A Python/C application developer processing many structurally similar short messages and small files, able to distribute the same dictionary to compressors and decompressors

Yes, especially when short messages and small files have stable structure and both endpoints can synchronize the dictionary.

  • The README explicitly supports dictionary compression at both API and CLI levels.
  • The dictionary may be any input file, but only its final 64 KB are used, so making the file arbitrarily larger is not useful.
  • It says this capability can be combined with the Zstandard Dictionary Builder to drastically improve compression for small files.
  • The API entry point is lib/lz4frame.h, while the CLI uses the -D operation modifier.

This is not a universal improvement for random data or messages with unrelated structures. The README does not state whether your Python binding exposes the dictionary API, nor the dictionary distribution cost, versioning, or mismatch behavior.

  • README, “LZ4 - Extremely fast compression”: “LZ4 is also compatible with dictionary compression”
  • README, “LZ4 - Extremely fast compression”: “only the final 64 KB are used”
  • README, “LZ4 - Extremely fast compression”: “drastically improve compression performance on small files”
  • README, “LZ4 - Extremely fast compression”: “both at API and CLI ... (`-D`) levels”
make
Not stated in the README:The README does not state whether the target Python binding supports the frame dictionary API.;It does not provide dictionary-generation quality, distribution overhead, version negotiation, or exact behavior on dictionary mismatch.

✨ Highlights

  • LZ4 compresses at over 500 MB/s per core
  • LZ4 v1.11.0 decompresses at 4950 MB/s
  • LZ4_HC -9 raises the compression ratio to 2.717
  • Dictionary compression works at both API and CLI levels

🔧 Engineering

  • Provides three C APIs: lz4.h, lz4hc.h, and lz4frame.h
  • The lz4 CLI supports -D dictionaries and frame streams
  • The acceleration factor trades compression ratio for speed

⚠️ Risks

  • Default LZ4 reaches 2.112, below Zstandard's 2.896
  • LZ4_HC -9 compresses at only 40 MB/s
  • liblz4 uses BSD 2-Clause; the lz4 CLI uses GPL-2.0-or-later
  • make install may require root permissions

👥 For who?

  • Developers integrating high-speed lossless compression through C/C++ APIs
  • Systems processing multi-core streams and prioritizing GB/s decompression
  • Linux users needing the lz4 CLI or Makefile-based builds