improved lz4opt speed (~4%)

This commit is contained in:
Yann Collet 2017-03-17 16:53:35 -07:00
parent eff6166eb8
commit 118b47f3d1

View File

@ -65,8 +65,8 @@ FORCE_INLINE size_t LZ4HC_sequencePrice(size_t litlen, size_t mlen)
price += LZ4HC_literalsPrice(litlen); price += LZ4HC_literalsPrice(litlen);
mlen -= MINMATCH; if (mlen >= (size_t)(ML_MASK+MINMATCH))
if (mlen >= (size_t)ML_MASK) price+= 1+(mlen-ML_MASK)/255; price+= 1+(mlen-(ML_MASK+MINMATCH))/255;
return price; return price;
} }
@ -190,12 +190,12 @@ FORCE_INLINE int LZ4HC_BinTree_GetAllMatches (
} }
#define SET_PRICE(pos, mlen, offset, litlen, price) \ #define SET_PRICE(pos, mlen, offset, ll, price) \
{ \ { \
while (last_pos < pos) { opt[last_pos+1].price = 1<<30; last_pos++; } \ while (last_pos < pos) { opt[last_pos+1].price = 1<<30; last_pos++; } \
opt[pos].mlen = (int)mlen; \ opt[pos].mlen = (int)mlen; \
opt[pos].off = (int)offset; \ opt[pos].off = (int)offset; \
opt[pos].litlen = (int)litlen; \ opt[pos].litlen = (int)ll; \
opt[pos].price = (int)price; \ opt[pos].price = (int)price; \
} }
@ -207,7 +207,7 @@ static int LZ4HC_compress_optimal (
int inputSize, int inputSize,
int maxOutputSize, int maxOutputSize,
limitedOutput_directive limit, limitedOutput_directive limit,
const size_t sufficient_len, size_t sufficient_len,
const int fullUpdate const int fullUpdate
) )
{ {
@ -226,6 +226,7 @@ static int LZ4HC_compress_optimal (
BYTE* const oend = op + maxOutputSize; BYTE* const oend = op + maxOutputSize;
/* init */ /* init */
if (sufficient_len >= LZ4_OPT_NUM) sufficient_len = LZ4_OPT_NUM-1;
ctx->end += inputSize; ctx->end += inputSize;
ip++; ip++;
@ -248,11 +249,10 @@ static int LZ4HC_compress_optimal (
/* set prices using matches at position = 0 */ /* set prices using matches at position = 0 */
for (i = 0; i < match_num; i++) { for (i = 0; i < match_num; i++) {
mlen = (i>0) ? (size_t)matches[i-1].len+1 : MINMATCH; mlen = (i>0) ? (size_t)matches[i-1].len+1 : MINMATCH;
best_mlen = (matches[i].len < LZ4_OPT_NUM) ? matches[i].len : LZ4_OPT_NUM; best_mlen = matches[i].len; /* necessarily < LZ4_OPT_NUM */
while (mlen <= best_mlen) { while (mlen <= best_mlen) {
litlen = 0; price = LZ4HC_sequencePrice(llen, mlen) - LZ4HC_literalsPrice(llen);
price = LZ4HC_sequencePrice(llen + litlen, mlen) - LZ4HC_literalsPrice(llen); SET_PRICE(mlen, mlen, matches[i].off, 0, price); /* updates last_pos and opt[pos] */
SET_PRICE(mlen, mlen, matches[i].off, litlen, price);
mlen++; mlen++;
} }
} }