68 lines
3.0 KiB
Diff
68 lines
3.0 KiB
Diff
|
From 00464ad8a698fe7735737fab57420f8a44013890 Mon Sep 17 00:00:00 2001
|
||
|
From: Jon Severinsson <jon@severinsson.net>
|
||
|
Date: Tue, 8 Jul 2014 18:29:46 +0200
|
||
|
Subject: [PATCH] journal/compress: improve xz compression performance
|
||
|
|
||
|
The new lzma2 compression options at the top of compress_blob_xz are
|
||
|
equivalent to using preset "0", exept for using a 1 MiB dictionary
|
||
|
(the same as preset "1"). This makes the memory usage at most 7.5 MiB
|
||
|
in the compressor, and 1 MiB in the decompressor, instead of the
|
||
|
previous 92 MiB in the compressor and 8 MiB in the decompressor.
|
||
|
|
||
|
According to test-compress-benchmark this commit makes XZ compression
|
||
|
20 times faster, with no increase in compressed data size.
|
||
|
Using more realistic test data (an ELF binary rather than repeating
|
||
|
ASCII letters 'a' through 'z' in order) it only provides a factor 10
|
||
|
speedup, and at a cost if a 10% increase in compressed data size.
|
||
|
But that is still a worthwhile trade-off.
|
||
|
|
||
|
According to test-compress-benchmark XZ compression is still 25 times
|
||
|
slower than LZ4, but the compressed data is one eighth the size.
|
||
|
Using more realistic test data XZ compression is only 18 times slower
|
||
|
than LZ4, and the compressed data is only one quarter the size.
|
||
|
|
||
|
$ ./test-compress-benchmark
|
||
|
XZ: compressed & decompressed 2535300963 bytes in 42.30s (57.15MiB/s), mean compresion 99.95%, skipped 3570 bytes
|
||
|
LZ4: compressed & decompressed 2535303543 bytes in 1.60s (1510.60MiB/s), mean compresion 99.60%, skipped 990 bytes
|
||
|
|
||
|
(cherry picked from commit 1930eed2a7855d2df06ccf51f9e394428bf547e2)
|
||
|
|
||
|
Conflicts:
|
||
|
src/journal/compress.c
|
||
|
---
|
||
|
src/journal/compress.c | 14 ++++++++++++--
|
||
|
1 file changed, 12 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/src/journal/compress.c b/src/journal/compress.c
|
||
|
index 1fc62ead2a..9c0b74c455 100644
|
||
|
--- a/src/journal/compress.c
|
||
|
+++ b/src/journal/compress.c
|
||
|
@@ -30,6 +30,13 @@
|
||
|
#include "util.h"
|
||
|
|
||
|
bool compress_blob(const void *src, uint64_t src_size, void *dst, uint64_t *dst_size) {
|
||
|
+ static const lzma_options_lzma opt = {
|
||
|
+ 1u << 20u, NULL, 0, LZMA_LC_DEFAULT, LZMA_LP_DEFAULT,
|
||
|
+ LZMA_PB_DEFAULT, LZMA_MODE_FAST, 128, LZMA_MF_HC3, 4};
|
||
|
+ static const lzma_filter filters[2] = {
|
||
|
+ {LZMA_FILTER_LZMA2, (lzma_options_lzma*) &opt},
|
||
|
+ {LZMA_VLI_UNKNOWN, NULL}
|
||
|
+ };
|
||
|
lzma_ret ret;
|
||
|
size_t out_pos = 0;
|
||
|
|
||
|
@@ -41,8 +48,11 @@ bool compress_blob(const void *src, uint64_t src_size, void *dst, uint64_t *dst_
|
||
|
/* Returns false if we couldn't compress the data or the
|
||
|
* compressed result is longer than the original */
|
||
|
|
||
|
- ret = lzma_easy_buffer_encode(LZMA_PRESET_DEFAULT, LZMA_CHECK_NONE, NULL,
|
||
|
- src, src_size, dst, &out_pos, src_size);
|
||
|
+ if (src_size < 80)
|
||
|
+ return -ENOBUFS;
|
||
|
+
|
||
|
+ ret = lzma_stream_buffer_encode((lzma_filter*) filters, LZMA_CHECK_NONE, NULL,
|
||
|
+ src, src_size, dst, &out_pos, src_size - 1);
|
||
|
if (ret != LZMA_OK)
|
||
|
return false;
|
||
|
|