summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorYann Collet <cyan@fb.com>2018-02-12 05:03:39 (GMT)
committerYann Collet <cyan@fb.com>2018-02-12 08:01:58 (GMT)
commitd3a13397d921d9d2ebae56d0503d23c73fee39b1 (patch)
tree402e1509f6e2a5965a142e7af9c526ededa2a2d0 /lib
parent2b674bf02f698b565b4525a36cdf4651899b88d1 (diff)
downloadlz4-d3a13397d921d9d2ebae56d0503d23c73fee39b1.zip
lz4-d3a13397d921d9d2ebae56d0503d23c73fee39b1.tar.gz
lz4-d3a13397d921d9d2ebae56d0503d23c73fee39b1.tar.bz2
slight hc speed benefit (~+1%)
by optimizing countback
Diffstat (limited to 'lib')
-rw-r--r--lib/lz4hc.c31
1 files changed, 10 insertions, 21 deletions
diff --git a/lib/lz4hc.c b/lib/lz4hc.c
index 9f59e80..c888ee1 100644
--- a/lib/lz4hc.c
+++ b/lib/lz4hc.c
@@ -123,10 +123,12 @@ LZ4_FORCE_INLINE
int LZ4HC_countBack(const BYTE* const ip, const BYTE* const match,
const BYTE* const iMin, const BYTE* const mMin)
{
- int back=0;
- while ( (ip+back > iMin)
- && (match+back > mMin)
- && (ip[back-1] == match[back-1]))
+ int back = 0;
+ int const min = (int)MAX(iMin - ip, mMin - match);
+ assert(ip >= iMin); assert((size_t)(ip-iMin) < (1U<<31));
+ assert(match >= mMin); assert((size_t)(match - mMin) < (1U<<31));
+ while ( (back > min)
+ && (ip[back-1] == match[back-1]) )
back--;
return back;
}
@@ -223,17 +225,7 @@ LZ4_FORCE_INLINE int LZ4HC_InsertAndGetWiderMatch (
if (LZ4_read16(iLowLimit + longest - 1) == LZ4_read16(matchPtr - delta + longest - 1)) {
if (LZ4_read32(matchPtr) == pattern) {
int mlt = MINMATCH + LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, iHighLimit);
- #if 0
- /* more generic but unfortunately slower on clang */
- int const back = LZ4HC_countBack(ip, matchPtr, iLowLimit, lowPrefixPtr);
- #else
- int back = 0;
- while ( (ip+back > iLowLimit)
- && (matchPtr+back > lowPrefixPtr)
- && (ip[back-1] == matchPtr[back-1])) {
- back--;
- }
- #endif
+ int const back = delta ? LZ4HC_countBack(ip, matchPtr, iLowLimit, lowPrefixPtr) : 0;
mlt -= back;
if (mlt > longest) {
@@ -252,10 +244,7 @@ LZ4_FORCE_INLINE int LZ4HC_InsertAndGetWiderMatch (
mlt = LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, vLimit) + MINMATCH;
if ((ip+mlt == vLimit) && (vLimit < iHighLimit))
mlt += LZ4_count(ip+mlt, base+dictLimit, iHighLimit);
- while ( (ip+back > iLowLimit)
- && (matchIndex+back > lowLimit)
- && (ip[back-1] == matchPtr[back-1]))
- back--;
+ back = delta ? LZ4HC_countBack(ip, matchPtr, iLowLimit, dictBase+lowLimit) : 0;
mlt -= back;
if (mlt > longest) {
longest = mlt;
@@ -333,7 +322,7 @@ LZ4_FORCE_INLINE int LZ4HC_encodeSequence (
size_t length;
BYTE* const token = (*op)++;
-#if defined(LZ4_DEBUG) && (LZ4_DEBUG >= 2)
+#if defined(LZ4_DEBUG) && (LZ4_DEBUG >= 6)
static const BYTE* start = NULL;
static U32 totalCost = 0;
U32 const pos = (start==NULL) ? 0 : (U32)(*anchor - start);
@@ -343,7 +332,7 @@ LZ4_FORCE_INLINE int LZ4HC_encodeSequence (
U32 const cost = 1 + llAdd + ll + 2 + mlAdd;
if (start==NULL) start = *anchor; /* only works for single segment */
//g_debuglog_enable = (pos >= 2228) & (pos <= 2262);
- DEBUGLOG(2, "pos:%7u -- literals:%3u, match:%4i, offset:%5u, cost:%3u + %u",
+ DEBUGLOG(6, "pos:%7u -- literals:%3u, match:%4i, offset:%5u, cost:%3u + %u",
pos,
(U32)(*ip - *anchor), matchLength, (U32)(*ip-match),
cost, totalCost);