Name

Deflate::Faster - fast gzip, zlib and raw DEFLATE using libdeflate

Synopsis

use Deflate::Faster qw(:all);

my $gz    = gzip($data);          # optional level: gzip($data, 1)
my $plain = gunzip($gz);

my $z   = deflate($data);         # zlib (RFC 1950)
my $raw = deflate_raw($data);     # raw DEFLATE (RFC 1951)

gzip_to_file($data, 'out.gz');
my $back = gunzip_file('out.gz');

my $df = Deflate::Faster->new;
$df->level(1);
$df->max_size(10 * 1024 * 1024);
my $out = $df->zip($data);
my $in  = $df->unzip($out);

Description

A drop-in replacement for Gzip::Faster built on libdeflate. Compression and decompression work on whole buffers in memory. Levels run from 0 (stored) to 12, default 6. Compressor and decompressor states are cached per thread.

Functions

gzip, deflate, deflate_raw

my $out = gzip($plain, $level);

Compress to gzip, zlib or raw DEFLATE. $level is optional; undef or -1 selects the default. Undefined or empty input warns and returns undef.

gunzip, inflate, inflate_raw

my $plain = gunzip($zipped);

Decompress. gunzip also accepts zlib streams and concatenated gzip members, and checks header CRCs. Corrupt, truncated or trailing data croaks. Undefined or empty input warns and returns undef.

gzip_file

my $zipped = gzip_file($file, %options);

Options: level, file_name (default $file), mod_time (default the file's mtime) and copy_perl_flags. Pass file_name => '' or mod_time => 0 to omit them.

gunzip_file

my $plain = gunzip_file($file, %options);

Options: max_size, copy_perl_flags, and scalar references file_name => \$name and mod_time => \$mtime to receive the header fields.

gzip_to_file, gunzip_to_file

gzip_to_file($plain, $file, %options);
gunzip_to_file($zipped, $file, %options);

Write the result to $file, truncating it. gzip_to_file takes the gzip_file options without their defaults; gunzip_to_file takes max_size and always writes bytes.

Methods

new

my $df = Deflate::Faster->new;

zip, unzip

my $out   = $df->zip($plain);
my $plain = $df->unzip($out);

Use the object's format and settings. zip writes file_name and mod_time into the gzip header, then clears file_name. unzip clears both, then sets them from the first gzip member's header.

gzip_format, raw

$df->gzip_format(1);
$df->raw(1);

Select gzip (the default) or raw DEFLATE. With both off the format is zlib.

level

$df->level($level);

0 to 12. undef or -1 selects 6; lower values warn and select 6; higher values warn and select 12.

max_size

$df->max_size($bytes);

Croak when decompressed output would exceed $bytes. Values below 1 and undef mean unlimited; strings convert as Perl numbers do. Without a limit, a gzip trailer claiming a large size can make a buffer grow to 8 times the output already decoded.

file_name

$df->file_name($name);
my $name = $df->file_name;

Gzip header file name, stored as Latin-1 and cut at the first NUL. A name with characters beyond Latin-1 croaks at zip.

mod_time

$df->mod_time($epoch);
my $epoch = $df->mod_time;

Gzip header time, an unsigned 32-bit integer. Out-of-range and non-numeric values warn and are clamped.

copy_perl_flags

$df->copy_perl_flags(1);

Record Perl's UTF-8 flag in the gzip header, in the same format as Gzip::Faster, and restore it on unzip when any member carries it and the output is valid UTF-8. Gzip format only.

Differences from Gzip::Faster

  • Concatenated gzip members decompress; Gzip::Faster croaks.

  • Trailing bytes after a stream croak.

  • Header CRCs (FHCRC) are checked.

  • Levels 0 to 12, and the procedural functions take an optional level.

  • unzip clears file_name and mod_time in every format.

  • gzip_file keeps its file name and mtime defaults when other options are given.

  • File names are written as Latin-1; wider characters croak.

  • mod_time is clamped to 32 bits instead of wrapping.

  • new blesses into the calling subclass.

  • The custom header OS byte is 0xff, and error messages differ.

Diagnostics

Empty input
Attempt to compress empty string
Attempt to uncompress empty string

(W) Undefined or empty input; undef is returned.

Data input to inflate is not in libz format

(F) Corrupt, truncated or trailing data.

Uncompressed data exceeds max_size of %d bytes

(F) See "max_size".

Gzip file_name must contain only Latin-1 characters

(F) See "file_name".

Cannot set compression level to less than 0
Cannot set compression level to more than 12
Argument "%s" isn't numeric in compression level
Cannot set modification time to less than 0
Cannot set modification time to more than 4294967295
Argument "%s" isn't numeric in modification time

(W) See "level" and "mod_time".

Cannot write file name to non-scalar reference
Cannot write modification time to non-scalar reference

(W) A gunzip_file option was not a scalar reference.

Performance

Speed relative to Gzip::Faster on Linux x86_64, averaged over eight kinds of text per size (bench/bench_vs_gzip_faster.pl):

size     gzip level 6   gzip level 1   gunzip
72 B          5.8x           7.2x        1.0x
2 KB          3.6x           6.4x        1.3x
100 KB        1.3x           4.1x        3.4x
1 MB          1.4x           4.4x        3.4x

Threads

Cached engines are freed when their thread exits. Objects are not cloned into new threads.

Exports

gzip, gunzip, gzip_file, gunzip_file and gzip_to_file by default; deflate, inflate, deflate_raw, inflate_raw and gunzip_to_file on request; :all for everything.

See also

Gzip::Faster, Gzip::Libdeflate, Compress::Raw::Zlib

Author

vividsnow

License

This software is copyright (c) 2026 by vividsnow.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.