仅支持当前 Go 版本及往前两个版本;使用 noasm 标签会禁用所有汇编优化;pgzip 是独立仓库需单独引入
go get github.com/klauspost/compress@latestREADME 未说明硬件要求,纯 Go 实现,可用 nounsafe 和 noasm 标签禁用 unsafe 与汇编。
纯 Go 实现的多算法压缩库,可直接替换标准库并提升压缩与解压性能
Go 语言的高性能压缩解压库,提供 deflate、gzip、zstd、snappy 等算法的优化实现,比标准库更快更省内存,适合对吞吐和延迟敏感的服务。
核心能力
- 纯 Go 实现 zstandard 压缩与解压
- S2 作为 Snappy 的高性能替代品
- flate/gzip/zip/zlib 可直接替换标准库
- snappy 兼容 golang/snappy 且支持并发流
- gzhttp 高效处理 gzip/zstd 的 HTTP 请求
容易踩的坑
- v1.20.4最新正式版2026-11-09 · 2026-11-09 13:01 UTC
What's Changed
- zstd: don't reuse a literal table that was not written by @klauspost in https://github.com/klauspost/compress/pull/1299
- zstd: preserve stream state when resetting options by @Grivn in https://github.com/klauspost/compress/pull/1266
- zstd, huff0, s2: bump the avo arm64 lowering; keep zstd stack slots in registers by @lizthegrey in https://github.com/klauspost/compress/pull/1248
- zstd, huff0: faster pure-Go decoders by @lizthegrey in https://github.com/klauspost/compress/pull/1256
- zstd: Don't retain pointers to decoded inputs in DecodeAll by @Jille in https://github.com/klauspost/compress/pull/1273
- zstd: inline the best encoder's reject path; cap concurrent-blocks job size by @bd-dstodolsky in https://github.com/klauspost/compress/pull/1293
- zstd: copy non-overlapping matches in 32-byte blocks by @lizthegrey in https://github.com/klauspost/compress/pull/1295
- zstd: cap DecodeAll preallocation to what the input can decode to by @Raghuvardhan-Reddy78 in https://github.com/klauspost/compress/pull/1291
- flate: build unrestricted Huffman trees before limiting lengths by @klauspost in https://github.com/klauspost/compress/pull/1219
- flate: Fix stateless EOF on large writes. by @klauspost in https://github.com/klauspost/compress/pull/1265
- flate: keep match history across small flushes by @klauspost in https://github.com/klauspost/compress/pull/1282
- gzip: write and read a zero MTIME for a zero ModTime by @spicysharkco in https://github.com/klauspost/compress/pull/1268
- zip: accept 0xFFFFFFFF sizes and offsets without a Zip64 extra by @ybai08 in https://github.com/klauspost/compress/pull/1267
- zip: backport the standard library's writer-side Zip64 fixes by @ybai08 in https://github.com/klauspost/compress/pull/1287
- gzip: backport two standard library fixes (truncated header EOF, Write count) by @ybai08 in https://github.com/klauspost/compress/pull/1270
- gzhttp: let "*" in Accept-Encoding select gzip or zstd by @Shaisolaris in https://github.com/klauspost/compress/pull/1263
- gzhttp: flush and hijack through http.ResponseController by @Neffi42 in https://github.com/klauspost/compress/pull/1272
- gzhttp: keep Vary: Accept-Encoding when the handler sets Vary by @wleeaf in https://github.com/klauspost/compress/pull/1284
- gzhttp: don't pool a decoder while a Read is still using it by @Raghuvardhan-Reddy78 in https://github.com/klauspost/compress/pull/1288
- gzhttp: clear Content-Length when decoding a compressed request by @Raghuvardhan-Reddy78 in https://github.com/klauspost/compress/pull/1301
- huff0: promote the 4X loop's input pointers to registers on arm64 by @lizthegrey in https://github.com/klauspost/compress/pull/1277
- s2: verify the CRC of chunk data kept after Skip by @Raghuvardhan-Reddy78 in https://github.com/klauspost/compress/pull/1286
- s2: don't read past src when converting LZ4 blocks by @Raghuvardhan-Reddy78 in https://github.com/klauspost/compress/pull/1294
- s2: fix LZ4 converter length overflow (32-bit only) by @klauspost in https://github.com/klauspost/compress/pull/1300
- s2: return ErrDstTooSmall for an LZ4 conversion into a nil dst by @yxshee in https://github.com/klauspost/compress/pull/1307
- s2: keep ErrCorrupt when Skip rejects an oversized chunk by @CJstate in https://github.com/klauspost/compress/pull/1303
New Contributors
- @Shaisolaris made their first contribution in https://github.com/klauspost/compress/pull/1263
- @Grivn made their first contribution in https://github.com/klauspost/compress/pull/1266
- @spicysharkco made their first contribution in https://github.com/klauspost/compress/pull/1268
- @ybai08 made their first contribution in https://github.com/klauspost/compress/pull/1267
- @Neffi42 made their first contribution in https://github.com/klauspost/compress/pull/1272
- @wleeaf made their first contribution in https://github.com/klauspost/compress/pull/1284
- @oddharsh made their first contribution in https://github.com/
- v1.20.32026-10-12 · 2026-10-12 10:10 UTC
查看更新说明
What's Changed
- zstd: two-pass decode with match-source prefetch on arm64 (largest win decoding SpeedBestCompression-class data) by @lizthegrey in https://github.com/klauspost/compress/pull/1212
- zstd: speed up better encoder hashing, primes in registers on arm64 by @lizthegrey in https://github.com/klauspost/compress/pull/1230
- zstd: reuse dictionary sequence tables in the encoder by @lizthegrey in https://github.com/klauspost/compress/pull/1233
- zstd: close most of the decode gap to libzstd on real corpora by @lizthegrey in https://github.com/klauspost/compress/pull/1232
- huff0: align the decode inner loops to 64 bytes by @lizthegrey in https://github.com/klauspost/compress/pull/1236
- zstd: keep default-encoder hash primes in registers on arm64 by @lizthegrey in https://github.com/klauspost/compress/pull/1241
- zstd: align the sequence decode and execute loops to 64 bytes by @lizthegrey in https://github.com/klauspost/compress/pull/1240
- zstd, huff0: cheaper per-block table setup by @lizthegrey in https://github.com/klauspost/compress/pull/1234
- zstd, s2, flate: smoke-test Silesia in CI, add real-corpus benchmarks by @lizthegrey in https://github.com/klauspost/compress/pull/1237
- zip: reject entries named "." in ReadDir to stop infinite fs.WalkDir by @Raghuvardhan-Reddy78 in https://github.com/klauspost/compress/pull/1249
- zstd: decode at full speed into exact-size destinations by @lizthegrey in https://github.com/klauspost/compress/pull/1246
- s2: Reject short index chunk in RemoveIndexHeaders by @Raghuvardhan-Reddy78 in https://github.com/klauspost/compress/pull/1254
- zstd, huff0: keep the encoder bit writers in registers by @lizthegrey in https://github.com/klauspost/compress/pull/1245
- huff0: reuse Scratch across inputs in the fuzzers by @lizthegrey in https://github.com/klauspost/compress/pull/1257
New Contributors
- @Raghuvardhan-Reddy78 made their first contribution in https://github.com/klauspost/compress/pull/1235
- @SulimanAbdulrazzaq made their first contribution in https://github.com/klauspost/compress/pull/1255
Full Changelog: https://github.com/klauspost/compress/compare/v1.20.1...v1.20.3
- v1.20.22026-10-12 · 2026-10-12 10:08 UTC
查看更新说明
- zstd: Fix DecodeAll crash on specially crafted input. GHSA-fpmh-frq8-7rj8.
- s2: fix LZ4 block conversion writing past dst by @klauspost in https://github.com/klauspost/compress/pull/1244
- dict: Stricter input validation by @klauspost in https://github.com/klauspost/compress/pull/1250
- zstd: reject snappy copy shorter than minimum match by @Raghuvardhan-Reddy78 in https://github.com/klauspost/compress/pull/1235
Full Changelog: https://github.com/klauspost/compress/compare/v1.20.1...v1.20.2
- v1.20.12026-09-25 · 2026-09-25 08:03 UTC
查看更新说明
What's Changed
- zstd: apply reset options to reused frame decoders by @pellared in https://github.com/klauspost/compress/pull/1226
- flate: Report unexpected EOF for truncated Huffman extra bits by @rupayon123 in https://github.com/klauspost/compress/pull/1229
- flate: avoid FMA in EstimatedBits for portable rounding by @malt3 in https://github.com/klauspost/compress/pull/1224
- gzhttp: preserve caller request headers in Transport by @jakezwang in https://github.com/klauspost/compress/pull/1225
- gzhttp: only decompress a request when gzip is the outermost coding by @youdie006 in https://github.com/klauspost/compress/pull/1223
- zstd/huff0: Optimizations by @lizthegrey in https://github.com/klauspost/compress/pull/1203 https://github.com/klauspost/compress/pull/1205 https://github.com/klauspost/compress/pull/1207 https://github.com/klauspost/compress/pull/1204 https://github.com/klauspost/compress/pull/1208 https://github.com/klauspost/compress/pull/1211 https://github.com/klauspost/compress/pull/1209 https://github.com/klauspost/compress/pull/1210
- flate: Speed improvements by @alex in https://github.com/klauspost/compress/pull/1220 https://github.com/klauspost/compress/pull/1218 https://github.com/klauspost/compress/pull/1216 https://github.com/klauspost/compress/pull/1215 https://github.com/klauspost/compress/pull/1214 https://github.com/klauspost/compress/pull/1217
New Contributors
- @xingyaner made their first contribution in https://github.com/klauspost/compress/pull/1222
- @jakezwang made their first contribution in https://github.com/klauspost/compress/pull/1225
- @youdie006 made their first contribution in https://github.com/klauspost/compress/pull/1223
- @pellared made their first contribution in https://github.com/klauspost/compress/pull/1226
- @malt3 made their first contribution in https://github.com/klauspost/compress/pull/1224
- @rupayon123 made their first contribution in https://github.com/klauspost/compress/pull/1229
Full Changelog: https://github.com/klauspost/compress/compare/v1.20.0...v1.20.1
- v1.20.02026-09-02 · 2026-09-02 12:26 UTC
查看更新说明
What's Changed
- Add lzw reader/writer by @klauspost in https://github.com/klauspost/compress/pull/1189
- xpress: add Microsoft XPRESS (MS-XCA) decompression by @MP-GOWTHAM in https://github.com/klauspost/compress/pull/1195
- s2: arm64 assembly encoders, lowered from the amd64 avo program by @lizthegrey in https://github.com/klauspost/compress/pull/1187
- zstd, huff0: improved arm64 lowering, and narrow two table loads to MOVWQZX by @lizthegrey in https://github.com/klauspost/compress/pull/1175
- gzhttp: limit jitter hash to jitterBuffer bytes by @VedantMadane in https://github.com/klauspost/compress/pull/1192
- s2: clamp the Go EncodeBetter skip to match the assembly by @lizthegrey in https://github.com/klauspost/compress/pull/1190
- xxhash: bound input of non-preemptive assembly by @AskAlexSharov in https://github.com/klauspost/compress/pull/1196
- zstd/huff0: fold two ISA-gap x86 idioms in the avo arm64 lowering by @lizthegrey in https://github.com/klauspost/compress/pull/1199
- ci: test against go1.27.x, drop go1.24.x by @lizthegrey in https://github.com/klauspost/compress/pull/1198
- zstd/huff0: break false partial-register dependencies in seqdec/4X decoders by @lizthegrey in https://github.com/klauspost/compress/pull/1197
- flate: Writer L7-9 with dictionary can emit the dictionary to stream by @klauspost in https://github.com/klauspost/compress/pull/1201
New Contributors
- @VedantMadane made their first contribution in https://github.com/klauspost/compress/pull/1192
- @AskAlexSharov made their first contribution in https://github.com/klauspost/compress/pull/1196
- @MP-GOWTHAM made their first contribution in https://github.com/klauspost/compress/pull/1195
Full Changelog: https://github.com/klauspost/compress/compare/v1.19.2...v1.20.0
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
compress
This package provides various compression algorithms.
- zstandard compression and decompression in pure Go.
- S2 is a high performance replacement for Snappy.
- Optimized deflate packages which can be used as a dropin replacement for gzip, zip and zlib.
- snappy is a drop-in replacement for
github.com/golang/snappyoffering better compression and concurrent streams. - lzw is a drop-in replacement for
compress/lzwwith 1.4-4x faster decompression and 1.1-2.7x faster compression, depending on the data. - huff0 and FSE implementations for raw entropy encoding.
- Xpress decompression of the Microsoft XPRESS (MS-XCA) plain LZ77 and LZ77+Huffman formats (the LZ77+Huffman variant is the one used in WIM images and Windows Compact OS / WOF data).
- dict is an experimental dictionary builder for Zstandard, S2, LZ4, deflate and more.
- gzhttp Provides client and server wrappers for handling gzipped/zstd HTTP requests efficiently.
- pgzip is a separate package that provides a very fast parallel gzip implementation.
package usage
Use go get github.com/klauspost/compress@latest to add it to your project.
This package will support the current Go version and 2 versions back.
- Use the
nounsafetag to disable all use of the "unsafe" package. - Use the
noasmtag to disable all assembly across packages.
Use the links above for more information on each.
changelog
-
Sep 25th, 2026 1.20.1
- zstd: Apply reset options to reused frame decoders by @pellared in https://github.com/klauspost/compress/pull/1226
- flate: Report unexpected EOF for truncated Huffman extra bits by @rupayon123 in https://github.com/klauspost/compress/pull/1229
- flate: Avoid FMA in EstimatedBits for portable rounding by @malt3 in https://github.com/klauspost/compress/pull/1224
- gzhttp: Preserve caller request headers in Transport by @jakezwang in https://github.com/klauspost/compress/pull/1225
- gzhttp: Only decompress a request when gzip is the outermost coding by @youdie006 in https://github.com/klauspost/compress/pull/1223
- zstd/huff0: Optimizations by @lizthegrey in https://github.com/klauspost/compress/pull/1203 https://github.com/klauspost/compress/pull/1205 https://github.com/klauspost/compress/pull/1207 https://github.com/klauspost/compress/pull/1204 https://github.com/klauspost/compress/pull/1208 https://github.com/klauspost/compress/pull/1211 https://github.com/klauspost/compress/pull/1209 https://github.com/klauspost/compress/pull/1210
- flate: Speed improvements by @alex in https://github.com/klauspost/compress/pull/1220 https://github.com/klauspost/compress/pull/1218 https://github.com/klauspost/compress/pull/1216 https://github.com/klauspost/compress/pull/1215 https://github.com/klauspost/compress/pull/1214 https://github.com/klauspost/compress/pull/1217
-
Sep 2nd, 2026 1.20.0
- lzw: Add lzw reader/writer in https://github.com/klauspost/compress/pull/1189
- xpress: Add Microsoft XPRESS (MS-XCA) decompression by @MP-GOWTHAM in https://github.com/klauspost/compress/pull/1195
- s2: arm64 assembly encoders by @lizthegrey in https://github.com/klauspost/compress/pull/1187
- zstd, huff0: Improved arm64 assembly by @lizthegrey in https://github.com/klauspost/compress/pull/1175 https://github.com/klauspost/compress/pull/1199 https://github.com/klauspost/compress/pull/1197
- flate: Writer L7-9 with dictionary can emit the dictionary to stream in https://github.com/klauspost/compress/pull/1201
- gzhttp: Limit jitter hash to jitterBuffer bytes by @VedantMadane in https://github.com/klauspost/compress/pull/1192
- s2: Clamp the Go EncodeBetter skip to match the assembly by @lizthegrey in https://github.com/klauspost/compress/pull/1190
- xxhash: Bound input of non-preemptive assembly by @AskAlexSharov in https://github.com/klauspost/compress/pull/1196
-
Aug 6th, 2026 1.19.2
- huff0: Add arm64 assembly for Decompress4X/1X by @lizthegrey in https://github.com/klauspost/compress/pull/1172
- zstd: Re-enable unsafe decodeSync memory copies by @lizthegrey in https://github.com/klauspost/compress/pull/1171
- zstd: Fix arm64 asm frame offsets placing locals on the saved LR slot by @lizthegrey in https://github.com/klauspost/compress/pull/1176
- zstd: Avoid racing MaxDecodedSize write on shared dict litEnc by @zanarellidev in https://github.com/klauspost/compress/pull/1182
- zstd: Keep BuildDict recent-offsets positive and loadable by @zanarellidev in https://github.com/klauspost/compress/pull/1184
- zstd: Handle zero-literal BuildDict corpus by @cyphercodes in https://github.com/klauspost/compress/pull/1178
- zstd: Don't clear the registered dictionary when decoding past the window by @sueun-dev in https://github.com/klauspost/compress/pull/1177
-
Jul 20th, 2026 1.19.1
- zstd: Validate SnappyConverter literal copies in https://github.com/klauspost/compress/pull/1170
- flate: Use
Peekinstead ofReadBytefor thebufio.Readerdecode path by @joechenrh in https://github.com/klauspost/compress/pull/1169 - zstd: Bump avo pin, regenerate arm64 asm by @lizthegrey in https://github.com/klauspost/compress/pull/1167
-
Jul 1st, 2026 1.19.0
- zstd: Add true concurrent stream encoding in https://github.com/klauspost/compress/pull/1136
- zstd: arm64 decoder asm by @lizthegrey in https://github.com/klauspost/compress/pull/1160
- flate: Add inflate checkpoints in https://github.com/klauspost/compress/pull/1154
- zstd: avoid unused BuildDict encoder allocation by @snissn in https://github.com/klauspost/compress/pull/1147
- snappy/s2: Limit length of varint in
decodedLenby @eustas in https://github.com/klauspost/compress/pull/1148 - gzhttp: match qvalue parameter case-insensitively (RFC 7231) by @z9z in https://github.com/klauspost/compress/pull/1149
- zip: add NameDecoder callback for legacy encoding rewrite by @SAY-5 in https://github.com/klauspost/compress/pull/1150
- huff0: Allow building tables from histogram in https://github.com/klauspost/compress/pull/1155
- huff0: Allow building table from oversized histogram in https://github.com/klauspost/compress/pull/1156
- s2sx: Clean symlink targets in https://github.com/klauspost/compress/pull/1163
-
Jun 30th, 2026 1.18.7
- s2: Fix
NewDictout-of-bounds read. Security release without other changes.
- s2: Fix
-
Apr 30th, 2026 1.18.6
- s2: Fix amd64 stack frame corruption in https://github.com/klauspost/compress/pull/1145
- gzhttp: Canonicalize ETag header by @justinmayhew in https://github.com/klauspost/compress/pull/1139
- Pool hash tables in Go encode paths to reduce allocations by @huynhanx03 in https://github.com/klauspost/compress/pull/1143
-
Mar 20th, 2026 1.18.5
- zstd: Fix crash when changing encoder dictionary with same ID in https://github.com/klauspost/compress/pull/1135
- zstd: Default to full zero frames in https://github.com/klauspost/compress/pull/1134
- flate: Clean up histogram order in https://github.com/klauspost/compress/pull/1133
-
Feb 9th, 2026 1.18.4
- gzhttp: Add zstandard to server handler wrapper https://github.com/klauspost/compress/pull/1121
- zstd: Add ResetWithOptions to encoder/decoder https://github.com/klauspost/compress/pull/1122
- gzhttp: preserve qvalue when extra parameters follow in Accept-Encoding by @analytically in https://github.com/klauspost/compress/pull/1116
-
Jan 16th, 2026 1.18.3
- Downstream CVE-2025-61728. See golang/go#77102.
-
Dec 1st, 2025 - 1.18.2
- flate: Fix invalid encoding on level 9 with single value input in https://github.com/klauspost/compress/pull/1115
- flate: reduce stateless allocations by @RXamzin in https://github.com/klauspost/compress/pull/1106
-
Oct 20, 2025 - 1.18.1 - RETRACTED
- zstd: Add simple zstd EncodeTo/DecodeTo functions https://github.com/klauspost/compress/pull/1079
- zstd: Fix incorrect buffer size in dictionary encodes https://github.com/klauspost/compress/pull/1059
- s2: check for cap, not len of buffer in EncodeBetter/Best by @vdarulis in https://github.com/klauspost/compress/pull/1080
- zlib: Avoiding extra allocation in zlib.reader.Reset by @travelpolicy in https://github.com/klauspost/compress/pull/1086
- gzhttp: remove redundant err check in zstdReader by @ryanfowler in https://github.com/klauspost/compress/pull/1090
- flate: Faster load+store https://github.com/klauspost/compress/pull/1104
- flate: Simplify matchlen https://github.com/klauspost/compress/pull/1101
- flate: Use exact sizes for huffman tables https://github.com/klauspost/compress/pull/1103
-
Feb 19th, 2025 - 1.18.0
- Add unsafe little endian loaders https://github.com/klauspost/compress/pull/1036
- fix: check
r.err != nilbut return a nil value errorerrby @alingse in https://github.com/klauspost/compress/pull/1028 - flate: Simplify L4-6 loading https://github.com/klauspost/compress/pull/1043
- flate: Simplify matchlen (remove asm) https://github.com/klauspost/compress/pull/1045
- s2: Improve small block compression speed w/o asm https://github.com/klauspost/compress/pull/1048
- flate: Fix matchlen L5+L6 https://github.com/klauspost/compress/pull/1049
- flate: Cleanup & reduce casts https://github.com/klauspost/compress/pull/1050
-
Oct 11th, 2024 - 1.17.11
- zstd: Fix extra CRC written with multiple Close calls https://github.com/klauspost/compress/pull/1017
- s2: Don't use stack for index tables https://github.com/klauspost/compress/pull/1014
- gzhttp: No content-type on no body response code by @juliens in https://github.com/klauspost/compress/pull/1011
- gzhttp: Do not set the content-type when response has no body by @kevinpollet in https://github.com/klauspost/compress/pull/1013
-
Sep 23rd, 2024 - 1.17.10
- gzhttp: Add TransportAlwaysDecompress option. https://github.com/klauspost/compress/pull/978
- gzhttp: Add supported decompress request body by @mirecl in https://github.com/klauspost/compress/pull/1002
- s2: Add EncodeBuffer buffer recycling callback https://github.com/klauspost/compress/pull/982
- zstd: Improve memory usage on small streaming encodes https://github.com/klauspost/compress/pull/1007
- flate: read data written with partial flush by @vajexal in https://github.com/klauspost/compress/pull/996
-
Jun 12th, 2024 - 1.17.9
- s2: Reduce ReadFrom temporary allocations https://github.com/klauspost/compress/pull/949
- flate, zstd: Shave some bytes off amd64 matchLen by @greatroar in https://github.com/klauspost/compress/pull/963
- Upgrade zip/zlib to 1.22.4 upstream https://github.com/klauspost/compress/pull/970 https://github.com/klauspost/compress/pull/971
- zstd: BuildDict fails with RLE table https://github.com/klauspost/compress/pull/951
-
Apr 9th, 2024 - 1.17.8
- zstd: Reject blocks where reserved values are not 0 https://github.com/klauspost/compress/pull/885
- zstd: Add RLE detection+encoding https://github.com/klauspost/compress/pull/938
-
Feb 21st, 2024 - 1.17.7
- s2: Add AsyncFlush method: Complete the block without flushing by @Jille in https://github.com/klauspost/compress/pull/927
- s2: Fix literal+repeat exceeds dst crash https://github.com/klauspost/compress/pull/930
-
Feb 5th, 2024 - 1.17.6
- zstd: Fix incorrect repeat coding in best mode https://github.com/klauspost/compress/pull/923
- s2: Fix DecodeConcurrent deadlock on errors https://github.com/klauspost/compress/pull/925
-
Jan 26th, 2024 - v1.17.5
- flate: Fix reset with dictionary on custom window encodes https://github.com/klauspost/compress/pull/912
- zstd: Add Frame header encoding and stripping https://github.com/klauspost/compress/pull/908
- zstd: Limit better/best default window to 8MB https://github.com/klauspost/compress/pull/913
- zstd: Speed improvements by @greatroar in https://github.com/klauspost/compress/pull/896 https://github.com/klauspost/compress/pull/910
- s2: Fix callbacks for skippable blocks and disallow 0xfe (Padding) by @Jille in https://github.com/klauspost/compress/pull/916 https://github.com/klauspost/compress/pull/917 https://github.com/klauspost/compress/pull/919 https://github.com/klauspost/compress/pull/918
-
Dec 1st, 2023 - v1.17.4
- huff0: Speed up symbol counting by @greatroar in https://github.com/klauspost/compress/pull/887
- huff0: Remove byteReader by @greatroar in https://github.com/klauspost/compress/pull/886
- gzhttp: Allow overriding decompression on transport https://github.com/klauspost/compress/pull/892
- gzhttp: Clamp compression level https://github.com/klauspost/compress/pull/890
- gzip: Error out if reserved bits are set https://github.com/klauspost/compress/pull/891
-
Nov 15th, 2023 - v1.17.3
- fse: Fix max header size https://github.com/klauspost/compress/pull/881
- zstd: Improve better/best compression https://github.com/klauspost/compress/pull/877
- gzhttp: Fix missing content type on Close https://github.com/klauspost/compress/pull/883
-
Oct 22nd, 2023 - v1.17.2
- zstd: Fix rare CORRUPTION output in "best" mode. See https://github.com/klauspost/compress/pull/876
-
Oct 14th, 2023 - v1.17.1
- s2: Fix S2 "best" dictionary wrong encoding https://github.com/klauspost/compress/pull/871
- flate: Reduce allocations in decompressor and minor code improvements by @fakefloordiv in https://github.com/klauspost/compress/pull/869
- s2: Fix EstimateBlockSize on 6&7 length input https://github.com/klauspost/compress/pull/867
-
Sept 19th, 2023 - v1.17.0
- Add experimental dictionary builder https://github.com/klauspost/compress/pull/853
- Add xerial snappy read/writer https://github.com/klauspost/compress/pull/838
- flate: Add limited window compression https://github.com/klauspost/compress/pull/843
- s2: Do 2 overlapping match checks https://github.com/klauspost/compress/pull/839
- flate: Add amd64 assembly matchlen https://github.com/klauspost/compress/pull/837
- gzip: Copy bufio.Reader on Reset by @thatguystone in https://github.com/klauspost/compress/pull/860
-
July 1st, 2023 - v1.16.7
- zstd: Fix default level first dictionary encode https://github.com/klauspost/compress/pull/829
- s2: add GetBufferCapacity() method by @GiedriusS in https://github.com/klauspost/compress/pull/832
-
June 13, 2023 - v1.16.6
- zstd: correctly ignore WithEncoderPadding(1) by @ianlancetaylor in https://github.com/klauspost/compress/pull/806
- zstd: Add amd64 match length assembly https://github.com/klauspost/compress/pull/824
- gzhttp: Handle informational headers by @rtribotte in https://github.com/klauspost/compress/pull/815
- s2: Improve Better compression slightly https://github.com/klauspost/compress/pull/663
-
Apr 16, 2023 - v1.16.5
- zstd: readByte needs to use io.ReadFull by @jnoxon in https://github.com/klauspost/compress/pull/802
- gzip: Fix WriterTo after initial read https://github.com/klauspost/compress/pull/804
-
Apr 5, 2023 - v1.16.4
- zstd: Improve zstd best efficiency by @greatroar and @klauspost in https://github.com/klauspost/compress/pull/784
- zstd: Respect WithAllLitEntropyCompression https://github.com/klauspost/compress/pull/792
- zstd: Fix amd64 not always detecting corrupt data https://github.com/klauspost/compress/pull/785
- zstd: Various minor improvements by @greatroar in https://github.com/klauspost/compress/pull/788 https://github.com/klauspost/compress/pull/794 https://github.com/klauspost/compress/pull/795
- s2: Fix huge block overflow https://github.com/klauspost/compress/pull/779
- s2: Allow CustomEncoder fallback https://github.com/klauspost/compress/pull/780
- gzhttp: Support ResponseWriter Unwrap() in gzhttp handler by @jgimenez in https://github.com/klauspost/compress/pull/799
-
Mar 13, 2023 - v1.16.1
- zstd: Speed up + improve best encoder by @greatroar in https://github.com/klauspost/compress/pull/776
- gzhttp: Add optional BREACH mitigation. https://github.com/klauspost/compress/pull/762 https://github.com/klauspost/compress/pull/768 https://github.com/klauspost/compress/pull/769 https://github.com/klauspost/compress/pull/770 https://github.com/klauspost/compress/pull/767
- s2: Add Intel LZ4s converter https://github.com/klauspost/compress/pull/766
- zstd: Minor bug fixes https://github.com/klauspost/compress/pull/771 https://github.com/klauspost/compress/pull/772 https://github.com/klauspost/compress/pull/773
- huff0: Speed up compress1xDo by @greatroar in https://github.com/klauspost/compress/pull/774
-
Feb 26, 2023 - v1.16.0
- s2: Add Dictionary support. https://github.com/klauspost/compress/pull/685
- s2: Add Compression Size Estimate. https://github.com/klauspost/compress/pull/752
- s2: Add support for custom stream encoder. https://github.com/klauspost/compress/pull/755
- s2: Add LZ4 block converter. https://github.com/klauspost/compress/pull/748
- s2: Support io.ReaderAt in ReadSeeker. https://github.com/klauspost/compress/pull/747
- s2c/s2sx: Use concurrent decoding. https://github.com/klauspost/compress/pull/746
-
Jan 21st, 2023 (v1.15.15)
- deflate: Improve level 7-9 https://github.com/klauspost/compress/pull/739
- zstd: Add delta encoding support by @greatroar in https://github.com/klauspost/compress/pull/728
- zstd: Various speed improvements by @greatroar https://github.com/klauspost/compress/pull/741 https://github.com/klauspost/compress/pull/734 https://github.com/klauspost/compress/pull/736 https://github.com/klauspost/compress/pull/744 https://github.com/klauspost/compress/pull/743 https://github.com/klauspost/compress/pull/745
- gzhttp: Add SuffixETag() and DropETag() options to prevent ETag collisions on compressed responses by @willbicks in https://github.com/klauspost/compress/pull/740
-
Jan 3rd, 2023 (v1.15.14)
- flate: Improve speed in big stateless blocks https://github.com/klauspost/compress/pull/718
- zstd: Minor speed tweaks by @greatroar in https://github.com/klauspost/compress/pull/716 https://github.com/klauspost/compress/pull/720
- export NoGzipResponseWriter for custom ResponseWriter wrappers by @harshavardhana in https://github.com/klauspost/compress/pull/722
- s2: Add example for indexing and existing stream https://github.com/klauspost/compress/pull/723
-
Dec 11, 2022 (v1.15.13)
- zstd: Add MaxEncodedSize to encoder https://github.com/klauspost/compress/pull/691
- zstd: Various tweaks and improvements https://github.com/klauspost/compress/pull/693 https://github.com/klauspost/compress/pull/695 https://github.com/klauspost/compress/pull/696 https://github.com/klauspost/compress/pull/701 https://github.com/klauspost/compress/pull/702 https://github.com/klauspost/compress/pull/703 https://github.com/klauspost/compress/pull/704 https://github.com/klauspost/compress/pull/705 https://github.com/klauspost/compress/pull/706 https://github.com/klauspost/compress/pull/707 https://github.com/klauspost/compress/pull/708
-
Oct 26, 2022 (v1.15.12)
- zstd: Tweak decoder allocs. https://github.com/klauspost/compress/pull/680
- gzhttp: Always delete
HeaderNoCompressionhttps://github.com/klauspost/compress/pull/683
-
Sept 26, 2022 (v1.15.11)
- flate: Improve level 1-3 compression https://github.com/klauspost/compress/pull/678
- zstd: Improve "best" compression by @nightwolfz in https://github.com/klauspost/compress/pull/677
- zstd: Fix+reduce decompression allocations https://github.com/klauspost/compress/pull/668
- zstd: Fix non-effective noescape tag https://github.com/klauspost/compress/pull/667
-
Sept 16, 2022 (v1.15.10)
- zstd: Add WithDecodeAllCapLimit https://github.com/klauspost/compress/pull/649
- Add Go 1.19 - deprecate Go 1.16 https://github.com/klauspost/compress/pull/651
- flate: Improve level 5+6 compression https://github.com/klauspost/compress/pull/656
- zstd: Improve "better" compression https://github.com/klauspost/compress/pull/657
- s2: Improve "best" compression https://github.com/klauspost/compress/pull/658
- s2: Improve "better" compression. https://github.com/klauspost/compress/pull/635
- s2: Slightly faster non-assembly decompression https://github.com/klauspost/compress/pull/646
- Use arrays for constant size copies https://github.com/klauspost/compress/pull/659
-
July 21, 2022 (v1.15.9)
- zstd: Fix decoder crash on amd64 (no BMI) on invalid input https://github.com/klauspost/compress/pull/645
- zstd: Disable decoder extended memory copies (amd64) due to possible crashes https://github.com/klauspost/compress/pull/644
- zstd: Allow single segments up to "max decoded size" https://github.com/klauspost/compress/pull/643
-
July 13, 2022 (v1.15.8)
- gzip: fix stack exhaustion bug in Reader.Read https://github.com/klauspost/compress/pull/641
- s2: Add Index header trim/restore https://github.com/klauspost/compress/pull/638
- zstd: Optimize seqdeq amd64 asm by @greatroar in https://github.com/klauspost/compress/pull/636
- zstd: Improve decoder memcopy https://github.com/klauspost/compress/pull/637
- huff0: Pass a single bitReader pointer to asm by @greatroar in https://github.com/klauspost/compress/pull/634
- zstd: Branchless getBits for amd64 w/o BMI2 by @greatroar in https://github.com/klauspost/compress/pull/640
- gzhttp: Remove header before writing https://github.com/klauspost/compress/pull/639
-
June 29, 2022 (v1.15.7)
- s2: Fix absolute forward seeks https://github.com/klauspost/compress/pull/633
- zip: Merge upstream https://github.com/klauspost/compress/pull/631
- zip: Re-add zip64 fix https://github.com/klauspost/compress/pull/624
- zstd: translate fseDecoder.buildDtable into asm by @WojciechMula in https://github.com/klauspost/compress/pull/598
- flate: Faster histograms https://github.com/klauspost/compress/pull/620
- deflate: Use compound hcode https://github.com/klauspost/compress/pull/622
-
June 3, 2022 (v1.15.6)
- s2: Improve coding for long, close matches https://github.com/klauspost/compress/pull/613
- s2c: Add Snappy/S2 stream recompression https://github.com/klauspost/compress/pull/611
- zstd: Always use configured block size https://github.com/klauspost/compress/pull/605
- zstd: Fix incorrect hash table placement for dict encoding in default https://github.com/klauspost/compress/pull/606
- zstd: Apply default config to ZipDecompressor without options https://github.com/klauspost/compress/pull/608
- gzhttp: Exclude more common archive formats https://github.com/klauspost/compress/pull/612
- s2: Add ReaderIgnoreCRC https://github.com/klauspost/compress/pull/609
- s2: Remove sanity load on index creation https://github.com/klauspost/compress/pull/607
- snappy: Use dedicated function for scoring https://github.com/klauspost/compress/pull/614
- s2c+s2d: Use official snappy framed extension https://github.com/klauspost/compress/pull/610
-
May 25, 2022 (v1.15.5)
- s2: Add concurrent stream decompression https://github.com/klauspost/compress/pull/602
- s2: Fix final emit oob read crash on amd64 https://github.com/klauspost/compress/pull/601
- huff0: asm implementation of Decompress1X by @WojciechMula https://github.com/klauspost/compress/pull/596
- zstd: Use 1 less goroutine for stream decoding https://github.com/klauspost/compress/pull/588
- zstd: Copy literal in 16 byte blocks when possible https://github.com/klauspost/compress/pull/592
- zstd: Speed up when WithDecoderLowmem(false) https://github.com/klauspost/compress/pull/599
- zstd: faster next state update in BMI2 version of decode by @WojciechMula in https://github.com/klauspost/compress/pull/593
- huff0: Do not check max size when reading table. https://github.com/klauspost/compress/pull/586
- flate: Inplace hashing for level 7-9 https://github.com/klauspost/compress/pull/590
-
May 11, 2022 (v1.15.4)
-
May 5, 2022 (v1.15.3)
-
Apr 26, 2022 (v1.15.2)
-
Mar 11, 2022 (v1.15.1)
-
Mar 3, 2022 (v1.15.0)
Both compression and decompression now supports "synchronous" stream operations. This means that whenever "concurrency" is set to 1, they will operate without spawning goroutines.
Stream decompression is now faster on asynchronous, since the goroutine allocation much more effectively splits the workload. On typical streams this will typically use 2 cores fully for decompression. When a stream has finished decoding no goroutines will be left over, so decoders can now safely be pooled and still be garbage collected.
While the release has been extensively tested, it is recommended to testing when upgrading.
-
Feb 22, 2022 (v1.14.4)
-
Feb 17, 2022 (v1.14.3)
-
Jan 25, 2022 (v1.14.2)
-
Jan 11, 2022 (v1.14.1)
-
Aug 30, 2021 (v1.13.5)
-
Aug 12, 2021 (v1.13.4)
- Add snappy replacement package.
- zstd: Fix incorrect encoding in "best" mode #415
-
Aug 3, 2021 (v1.13.3)
-
Jun 14, 2021 (v1.13.1)
- s2: Add full Snappy output support #396
- zstd: Add configurable Decoder window size #394
- gzhttp: Add header to skip compression #389
- s2: Improve speed with bigger output margin #395
-
Jun 3, 2021 (v1.13.0)
-
May 25, 2021 (v1.12.3)
-
Apr 27, 2021 (v1.12.2)
-
Apr 14, 2021 (v1.12.1)
- snappy package removed. Upstream added as dependency.
- s2: Better compression in "best" mode #353
- s2sx: Add stdin input and detect pre-compressed from signature #352
- s2c/s2d: Add http as possible input #348
- s2c/s2d/s2sx: Always truncate when writing files #352
- zstd: Reduce memory usage further when using WithLowerEncoderMem #346
- s2: Fix potential problem with amd64 assembly and profilers #349
-
Mar 26, 2021 (v1.11.13)
-
Mar 5, 2021 (v1.11.12)
- s2: Add
s2sxbinary that creates self extracting archives. - s2: Speed up decompression on non-assembly platforms #328
- s2: Add
-
Mar 1, 2021 (v1.11.9)
-
Feb 25, 2021 (v1.11.8)
-
Jan 14, 2021 (v1.11.7)
-
Jan 7, 2021 (v1.11.6)
-
Dec 20, 2020 (v1.11.4)
-
Nov 15, 2020 (v1.11.3)
-
Oct 11, 2020 (v1.11.2)
- s2: Fix out of bounds read in "better" block compression #291
-
Oct 1, 2020 (v1.11.1)
- zstd: Set allLitEntropy true in default configuration #286
-
Sept 8, 2020 (v1.11.0)
- zstd: Add experimental compression dictionaries #281
- zstd: Fix mixed Write and ReadFrom calls #282
- inflate/gz: Limit variable shifts, ~5% faster decompression #274
-
July 8, 2020 (v1.10.11)
-
June 23, 2020 (v1.10.10)
- zstd: Skip entropy compression in fastest mode when no matches. #270
-
June 16, 2020 (v1.10.9):
-
June 5, 2020 (v1.10.8):
- 1.15x faster zstd block decompression. #265
-
June 1, 2020 (v1.10.7):
- Added zstd decompression dictionary support
- Increase zstd decompression speed up to 1.19x. #259
- Remove internal reset call in zstd compression and reduce allocations. #263
-
May 21, 2020: (v1.10.6)
-
April 12, 2020: (v1.10.5)
- s2-commands: Flush output when receiving SIGINT. #239
-
Apr 8, 2020: (v1.10.4)
-
Mar 11, 2020: (v1.10.3)
-
Feb 27, 2020: (v1.10.2)
-
Feb 18, 2020: (v1.10.1)
-
Feb 4, 2020: (v1.10.0)
- Add optional dictionary to stateless deflate. Breaking change, send
nilfor previous behaviour. #216 - Fix buffer overflow on repeated small block deflate. #218
- Allow copying content from an existing ZIP file without decompressing+compressing. #214
- Added S2 AMD64 assembler and various optimizations. Stream speed >10GB/s. #186
- Add optional dictionary to stateless deflate. Breaking change, send
- Jan 20,2020 (v1.9.8) Optimize gzip/deflate with better size estimates and faster table generation. #207 by luyu6056, #206.
- Jan 11, 2020: S2 Encode/Decode will use provided buffer if capacity is big enough. #204
- Jan 5, 2020: (v1.9.7) Fix another zstd regression in v1.9.5 - v1.9.6 removed.
- Jan 4, 2020: (v1.9.6) Regression in v1.9.5 fixed causing corrupt zstd encodes in rare cases.
- Jan 4, 2020: Faster IO in s2c + s2d commandline tools compression/decompression. #192
- Dec 29, 2019: Removed v1.9.5 since fuzz tests showed a compatibility problem with the reference zstandard decoder.
- Dec 29, 2019: (v1.9.5) zstd: 10-20% faster block compression. #199
- Dec 29, 2019: zip package updated with latest Go features
- Dec 29, 2019: zstd: Single segment flag condintions tweaked. #197
- Dec 18, 2019: s2: Faster compression when ReadFrom is used. #198
- Dec 10, 2019: s2: Fix repeat length output when just above at 16MB limit.
- Dec 10, 2019: zstd: Add function to get decoder as io.ReadCloser. #191
- Dec 3, 2019: (v1.9.4) S2: limit max repeat length. #188
- Dec 3, 2019: Add WithNoEntropyCompression to zstd #187
- Dec 3, 2019: Reduce memory use for tests. Check for leaked goroutines.
- Nov 28, 2019 (v1.9.3) Less allocations in stateless deflate.
- Nov 28, 2019: 5-20% Faster huff0 decode. Impacts zstd as well. #184
- Nov 12, 2019 (v1.9.2) Added Stateless Compression for gzip/deflate.
- Nov 12, 2019: Fixed zstd decompression of large single blocks. #180
- Nov 11, 2019: Set default s2c block size to 4MB.
- Nov 11, 2019: Reduce inflate memory use by 1KB.
- Nov 10, 2019: Less allocations in deflate bit writer.
- Nov 10, 2019: Fix inconsistent error returned by zstd decoder.
- Oct 28, 2019 (v1.9.1) ztsd: Fix crash when compressing blocks. #174
- Oct 24, 2019 (v1.9.0) zstd: Fix rare data corruption #173
- Oct 24, 2019 zstd: Fix huff0 out of buffer write #171 and always return errors #172
- Oct 10, 2019: Big deflate rewrite, 30-40% faster with better compression #105
- Oct 10, 2019: (v1.8.6) zstd: Allow partial reads to get flushed data. #169
- Oct 3, 2019: Fix inconsistent results on broken zstd streams.
- Sep 25, 2019: Added
-rm(remove source files) and-q(no output except errors) tos2cands2dcommands - Sep 16, 2019: (v1.8.4) Add
s2cands2dcommandline tools. - Sep 10, 2019: (v1.8.3) Fix s2 decoder Skip.
- Sep 7, 2019: zstd: Added WithWindowSize, contributed by ianwilkes.
- Sep 5, 2019: (v1.8.2) Add WithZeroFrames which adds full zero payload block encoding option.
- Sep 5, 2019: Lazy initialization of zstandard predefined en/decoder tables.
- Aug 26, 2019: (v1.8.1) S2: 1-2% compression increase in "better" compression mode.
- Aug 26, 2019: zstd: Check maximum size of Huffman 1X compressed literals while decoding.
- Aug 24, 2019: (v1.8.0) Added S2 compression, a high performance replacement for Snappy.
- Aug 21, 2019: (v1.7.6) Fixed minor issues found by fuzzer. One could lead to zstd not decompressing.
- Aug 18, 2019: Add fuzzit continuous fuzzing.
- Aug 14, 2019: zstd: Skip incompressible data 2x faster. #147
- Aug 4, 2019 (v1.7.5): Better literal compression. #146
- Aug 4, 2019: Faster zstd compression. #143 #144
- Aug 4, 2019: Faster zstd decompression. #145 #143 #142
- July 15, 2019 (v1.7.4): Fix double EOF block in rare cases on zstd encoder.
- July 15, 2019 (v1.7.3): Minor speedup/compression increase in default zstd encoder.
- July 14, 2019: zstd decoder: Fix decompression error on multiple uses with mixed content.
- July 7, 2019 (v1.7.2): Snappy update, zstd decoder potential race fix.
- June 17, 2019: zstd decompression bugfix.
- June 17, 2019: fix 32 bit builds.
- June 17, 2019: Easier use in modules (less dependencies).
- June 9, 2019: New stronger "default" zstd compression mode. Matches zstd default compression ratio.
- June 5, 2019: 20-40% throughput in zstandard compression and better compression.
- June 5, 2019: deflate/gzip compression: Reduce memory usage of lower compression levels.
- June 2, 2019: Added zstandard compression!
- May 25, 2019: deflate/gzip: 10% faster bit writer, mostly visible in lower levels.
- Apr 22, 2019: zstd decompression added.
- Aug 1, 2018: Added huff0 README.
- Jul 8, 2018: Added Performance Update 2018 below.
- Jun 23, 2018: Merged Go 1.11 inflate optimizations. Go 1.9 is now required. Backwards compatible version tagged with v1.3.0.
- Apr 2, 2018: Added huff0 en/decoder. Experimental for now, API may change.
- Mar 4, 2018: Added FSE Entropy en/decoder. Experimental for now, API may change.
- Nov 3, 2017: Add compression Estimate function.
- May 28, 2017: Reduce allocations when resetting decoder.
- Apr 02, 2017: Change back to official crc32, since changes were merged in Go 1.7.
- Jan 14, 2017: Reduce stack pressure due to array copies. See Issue #18625.
- Oct 25, 2016: Level 2-4 have been rewritten and now offers significantly better performance than before.
- Oct 20, 2016: Port zlib changes from Go 1.7 to fix zlib writer issue. Please update.
- Oct 16, 2016: Go 1.7 changes merged. Apples to apples this package is a few percent faster, but has a significantly better balance between speed and compression per level.
- Mar 24, 2016: Always attempt Huffman encoding on level 4-7. This improves base 64 encoded data compression.
- Mar 24, 2016: Small speedup for level 1-3.
- Feb 19, 2016: Faster bit writer, level -2 is 15% faster, level 1 is 4% faster.
- Feb 19, 2016: Handle small payloads faster in level 1-3.
- Feb 19, 2016: Added faster level 2 + 3 compression modes.
- Feb 19, 2016: Rebalanced compression levels, so there is a more even progression in terms of compression. New default level is 5.
- Feb 14, 2016: Snappy: Merge upstream changes.
- Feb 14, 2016: Snappy: Fix aggressive skipping.
- Feb 14, 2016: Snappy: Update benchmark.
- Feb 13, 2016: Deflate: Fixed assembler problem that could lead to sub-optimal compression.
- Feb 12, 2016: Snappy: Added AMD64 SSE 4.2 optimizations to matching, which makes easy to compress material run faster. Typical speedup is around 25%.
- Feb 9, 2016: Added Snappy package fork. This version is 5-7% faster, much more on hard to compress content.
- Jan 30, 2016: Optimize level 1 to 3 by not considering static dictionary or storing uncompressed. ~4-5% speedup.
- Jan 16, 2016: Optimization on deflate level 1,2,3 compression.
- Jan 8 2016: Merge CL 18317: fix reading, writing of zip64 archives.
- Dec 8 2015: Make level 1 and -2 deterministic even if write size differs.
- Dec 8 2015: Split encoding functions, so hashing and matching can potentially be inlined. 1-3% faster on AMD64. 5% faster on other platforms.
- Dec 8 2015: Fixed rare one byte out-of bounds read. Please update!
- Nov 23 2015: Optimization on token writer. ~2-4% faster. Contributed by @dsnet.
- Nov 20 2015: Small optimization to bit writer on 64 bit systems.
- Nov 17 2015: Fixed out-of-bound errors if the underlying Writer returned an error. See #15.
- Nov 12 2015: Added io.WriterTo support to gzip/inflate.
- Nov 11 2015: Merged CL 16669: archive/zip: enable overriding (de)compressors per file
- Oct 15 2015: Added skipping on uncompressible data. Random data speed up >5x.
deflate usage
The packages are drop-in replacements for standard library deflate, gzip, zip, and zlib. Simply replace the import path to use them:
Typical speed is about 2x of the standard library packages.
| old import | new import | Documentation |
|---|---|---|
compress/gzip | github.com/klauspost/compress/gzip | gzip |
compress/zlib | github.com/klauspost/compress/zlib | zlib |
archive/zip | github.com/klauspost/compress/zip | zip |
compress/flate | github.com/klauspost/compress/flate | flate |
You may also be interested in pgzip, which is a drop-in replacement for gzip, which support multithreaded compression on big files and the optimized crc32 package used by these packages.
The packages implement the same API as the standard library, so you can use the original godoc documentation: gzip, zip, zlib, flate.
Currently there is only minor speedup on decompression (mostly CRC32 calculation).
Memory usage is typically 1MB for a Writer. stdlib is in the same range. If you expect to have a lot of concurrently allocated Writers consider using the stateless compression described below.
For compression performance, see: this spreadsheet.
To disable all assembly add -tags=noasm. This works across all packages.
Stateless compression
This package offers stateless compression as a special option for gzip/deflate. It will do compression but without maintaining any state between Write calls.
This means there will be no memory kept between Write calls, but compression and speed will be suboptimal.
This is only relevant in cases where you expect to run many thousands of compressors concurrently, but with very little activity. This is not intended for regular web servers serving individual requests.
Because of this, the size of actual Write calls will affect output size.
In gzip, specify level -3 / gzip.StatelessCompression to enable.
For direct deflate use, NewStatelessWriter and StatelessDeflate are available. See documentation
A bufio.Writer can of course be used to control write sizes. For example, to use a 4KB buffer:
// replace 'ioutil.Discard' with your output.
gzw, err := gzip.NewWriterLevel(ioutil.Discard, gzip.StatelessCompression)
if err != nil {
return err
}
defer gzw.Close()
w := bufio.NewWriterSize(gzw, 4096)
defer w.Flush()
// Write to 'w'
This will only use up to 4KB in memory when the writer is idle.
Compression is almost always worse than the fastest compression level and each write will allocate (a little) memory.
Other packages
Here are other packages of good quality and pure Go (no cgo wrappers or autoconverted code):
- github.com/pierrec/lz4 - strong multithreaded LZ4 compression.
- github.com/cosnicolaou/pbzip2 - multithreaded bzip2 decompression.
- github.com/dsnet/compress - brotli decompression, bzip2 writer.
- [github.com/ronanh/intcomp](https://github.com