From 9b8e453713b3941b21f1192df53ea49d3611d6dd Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 6 Nov 2015 18:28:02 +0100 Subject: [PATCH] minor CRatio improvement --- lib/zstdhc.c | 25 ++++++++++++++++--------- lib/zstdhc_static.h | 4 ++-- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/lib/zstdhc.c b/lib/zstdhc.c index e2dfafc1d..dbc7a3a99 100644 --- a/lib/zstdhc.c +++ b/lib/zstdhc.c @@ -655,6 +655,7 @@ size_t ZSTD_HC_compressBlock_lazy_generic(ZSTD_HC_CCtx* ctx, /* let's try to find a better solution */ start = ip; + while ((start>anchor) && (start-offset>ctx->base) && (start[-1] == start[-1-offset])) { start--; matchLength++; } /* catch up */ while (ipanchor) && (start2-offset2>ctx->base) && (start2[-1] == start2[-1-offset2])) { start2--; ml2++; } /* catch up */ + gain2 = (int)(ml2*(3+deep) - ZSTD_highbit((U32)offset2+1)); /* raw approx */ + gain1 = (int)(matchLength*(3+deep) - ZSTD_highbit((U32)offset+1) + (3+deep)); if (gain2 > gain1) { - matchLength = ml2, offset = offset2, start = ip; + matchLength = ml2, offset = offset2, start = start2; continue; /* search a better one */ } } @@ -694,12 +699,16 @@ size_t ZSTD_HC_compressBlock_lazy_generic(ZSTD_HC_CCtx* ctx, { size_t offset2=999999; size_t ml2 = searchMax(ctx, ip, iend, &offset2, maxSearches, mls); - int gain2 = (int)(ml2*4 - ZSTD_highbit((U32)offset2+1)); /* raw approx */ - int gain1 = (int)(matchLength*4 - ZSTD_highbit((U32)offset+1) + 7); + const BYTE* start2 = ip; + int gain1, gain2; + if (ml2) + while ((start2>anchor) && (start2-offset2>ctx->base) && (start2[-1] == start2[-1-offset2])) { start2--; ml2++; } /* catch up */ + gain2 = (int)(ml2*(3+deep) - ZSTD_highbit((U32)offset2+1)); /* raw approx */ + gain1 = (int)(matchLength*(3+deep) - ZSTD_highbit((U32)offset+1) + (3+deep)); if (gain2 > gain1) { - matchLength = ml2, offset = offset2, start = ip; - continue; + matchLength = ml2, offset = offset2, start = start2; + continue; /* search a better one */ } } } @@ -707,8 +716,6 @@ size_t ZSTD_HC_compressBlock_lazy_generic(ZSTD_HC_CCtx* ctx, } /* store sequence */ - if (offset) - while ((start>anchor) && (start-offset>ctx->base) && (start[-1] == start[-1-offset])) { start--; matchLength++; } /* catch up */ { size_t litLength = start - anchor; if (offset) offset_1 = offset; diff --git a/lib/zstdhc_static.h b/lib/zstdhc_static.h index 52e9bb88d..63214a1b5 100644 --- a/lib/zstdhc_static.h +++ b/lib/zstdhc_static.h @@ -111,8 +111,8 @@ static const ZSTD_HC_parameters ZSTD_HC_defaultParameters[ZSTD_HC_MAX_CLEVEL+1] { 21, 17, 20, 3, 5, ZSTD_HC_lazy }, /* level 7 */ { 21, 19, 20, 3, 5, ZSTD_HC_lazy }, /* level 8 */ { 21, 19, 20, 4, 5, ZSTD_HC_lazy }, /* level 9 */ - { 21, 19, 20, 5, 5, ZSTD_HC_lazy }, /* level 10 */ - { 21, 20, 20, 5, 5, ZSTD_HC_lazy }, /* level 11 */ + { 21, 19, 20, 4, 5, ZSTD_HC_lazy2 }, /* level 10 */ + { 21, 20, 21, 4, 5, ZSTD_HC_lazy2 }, /* level 11 */ { 22, 20, 22, 5, 5, ZSTD_HC_lazy2 }, /* level 12 */ { 22, 21, 22, 5, 5, ZSTD_HC_lazy2 }, /* level 13 */ { 22, 22, 23, 5, 5, ZSTD_HC_lazy2 }, /* level 14 */ -- 2.47.3