Use adapt2 as default compression in archive mode.
Add more filter auto-selection by compression level in archive mode. Replace odd stride lengths in Delta2 with standard numeric type lengths and improve performance.
This commit is contained in:
parent
316d5aa4a8
commit
36ed5d5a78
4 changed files with 42 additions and 6 deletions
|
@ -302,7 +302,7 @@ $(PJPGOBJS): $(PJPGSRCS) $(PJPGHDRS)
|
|||
$(VEC_FLAGS) -DBUILD_LIB $(COMMON_CPPFLAGS_cpp) $(@:.o=.cpp) -o $@
|
||||
|
||||
$(DISPACKOBJS): $(DISPACKSRCS) $(DISPACKHDRS)
|
||||
$(COMPILE_cpp) $(COMMON_VEC_FLAGS) @SSE_OPT_FLAGS@ -O2 -fsched-spec-load \
|
||||
$(COMPILE_cpp) $(COMMON_VEC_FLAGS) $(DEBUG_STATS_CPPFLAGS) @SSE_OPT_FLAGS@ -O2 -fsched-spec-load \
|
||||
-Wno-variadic-macros $(VEC_FLAGS) $(COMMON_CPPFLAGS_cpp) $(@:.o=.cpp) -o $@
|
||||
|
||||
$(SKEIN_BLOCK_OBJ): $(SKEIN_BLOCK_SRC)
|
||||
|
|
|
@ -91,10 +91,11 @@
|
|||
|
||||
/*
|
||||
* Stride values to be checked. As of this implementation strides only
|
||||
* upto 8 bytes (uint64_t) are supported.
|
||||
* upto 8 bytes (uint64_t) are supported and common type lengths only
|
||||
* are checked.
|
||||
*/
|
||||
#define NSTRIDES 4
|
||||
static uchar_t strides[NSTRIDES] = {3, 5, 7, 8};
|
||||
#define NSTRIDES 3
|
||||
static uchar_t strides[NSTRIDES] = {2, 4, 8};
|
||||
|
||||
|
||||
static int delta2_encode_real(uchar_t *src, uint64_t srclen, uchar_t *dst, uint64_t *dstlen,
|
||||
|
|
|
@ -29,6 +29,9 @@
|
|||
#include <string.h>
|
||||
#include <malloc.h>
|
||||
#include <assert.h>
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
/* Version history:
|
||||
*
|
||||
|
@ -944,10 +947,16 @@ dispack_encode(uchar_t *from, uint64_t fromlen, uchar_t *to, uint64_t *dstlen)
|
|||
{
|
||||
uchar_t *pos, *hdr, type, *pos_to, *to_last;
|
||||
uint64_t len;
|
||||
#ifdef DEBUG_STATS
|
||||
double strt, en;
|
||||
#endif
|
||||
|
||||
if (fromlen < DISFILTER_BLOCK)
|
||||
return (-1);
|
||||
|
||||
#ifdef DEBUG_STATS
|
||||
strt = get_wtime_millis();
|
||||
#endif
|
||||
pos = from;
|
||||
len = fromlen;
|
||||
pos_to = to;
|
||||
|
@ -1009,9 +1018,19 @@ dispack_encode(uchar_t *from, uint64_t fromlen, uchar_t *to, uint64_t *dstlen)
|
|||
len -= sz;
|
||||
}
|
||||
*dstlen = pos_to - to;
|
||||
#ifdef DEBUG_STATS
|
||||
en = get_wtime_millis();
|
||||
cerr << "Dispack: Processed at " << get_mb_s(fromlen, strt, en) << " MB/s" << endl;
|
||||
#endif
|
||||
if ((fromlen - *dstlen) < DIS_MIN_REDUCE) {
|
||||
#ifdef DEBUG_STATS
|
||||
cerr << "Dispack: Failed, reduction too less" << endl;
|
||||
#endif
|
||||
return (-1);
|
||||
}
|
||||
#ifdef DEBUG_STATS
|
||||
cerr << "Dispack: srclen: " << fromlen << ", dstlen: " << *dstlen << endl;
|
||||
#endif
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
20
pcompress.c
20
pcompress.c
|
@ -2946,6 +2946,7 @@ init_pc_context(pc_ctx_t *pctx, int argc, char *argv[])
|
|||
|
||||
case 'a':
|
||||
pctx->archive_mode = 1;
|
||||
pctx->do_compress = 1;
|
||||
break;
|
||||
|
||||
case 'v':
|
||||
|
@ -2978,6 +2979,19 @@ init_pc_context(pc_ctx_t *pctx, int argc, char *argv[])
|
|||
return (2);
|
||||
}
|
||||
|
||||
if (pctx->archive_mode && pctx->do_uncompress) {
|
||||
log_msg(LOG_ERR, 0, "'-a' flag is only for archive creation.");
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Default compression algorithm during archiving is Adaptive2.
|
||||
*/
|
||||
if (pctx->archive_mode && pctx->algo == NULL) {
|
||||
pctx->algo = "adapt2";
|
||||
init_algo(pctx, pctx->algo, 1);
|
||||
}
|
||||
|
||||
if (pctx->level == -1 && pctx->do_compress) {
|
||||
if (memcmp(pctx->algo, "lz4", 3) == 0) {
|
||||
pctx->level = 1;
|
||||
|
@ -3204,16 +3218,18 @@ init_pc_context(pc_ctx_t *pctx, int argc, char *argv[])
|
|||
}
|
||||
|
||||
/*
|
||||
* Selectively enable filters while compressing.
|
||||
* Selectively enable filters while archiving, depending on compression level.
|
||||
*/
|
||||
if (pctx->archive_mode) {
|
||||
struct filter_flags ff;
|
||||
|
||||
ff.enable_packjpg = 0;
|
||||
if (pctx->level > 9) ff.enable_packjpg = 1;
|
||||
if (pctx->level > 10) ff.enable_packjpg = 1;
|
||||
init_filters(&ff);
|
||||
pctx->enable_packjpg = ff.enable_packjpg;
|
||||
if (pctx->level > 8) pctx->dispack_preprocess = 1;
|
||||
if (pctx->level > 4) pctx->enable_delta2_encode = 1;
|
||||
if (pctx->level > 9) pctx->lzp_preprocess = 1;
|
||||
}
|
||||
if (pctx->lzp_preprocess || pctx->enable_delta2_encode || pctx->dispack_preprocess) {
|
||||
pctx->preprocess_mode = 1;
|
||||
|
|
Loading…
Reference in a new issue