small compression speed improvement
authoryann.collet.73@gmail.com <yann.collet.73@gmail.com@650e7d94-2a16-8b24-b05c-7c0b3f6821cd>
Thu, 15 Sep 2011 21:37:09 +0000 (21:37 +0000)
committeryann.collet.73@gmail.com <yann.collet.73@gmail.com@650e7d94-2a16-8b24-b05c-7c0b3f6821cd>
Thu, 15 Sep 2011 21:37:09 +0000 (21:37 +0000)
git-svn-id: https://lz4.googlecode.com/svn/trunk@22 650e7d94-2a16-8b24-b05c-7c0b3f6821cd

lz4.c

diff --git a/lz4.c b/lz4.c
index 9a96617..a8d1629 100644 (file)
--- a/lz4.c
+++ b/lz4.c
@@ -111,7 +111,6 @@ int LZ4_compressCtx(void** ctx,
 \r
        const BYTE* ip = (BYTE*) source;       \r
        const BYTE* anchor = ip;\r
-       const BYTE* ref;\r
        const BYTE* const iend = ip + isize;\r
        const BYTE* const ilimit = iend - MINMATCH;\r
 \r
@@ -121,7 +120,7 @@ int LZ4_compressCtx(void** ctx,
        \r
        int len, length;\r
        const int skipStrength = SKIPSTRENGTH;\r
-       U32 skipped = 1U << skipStrength;\r
+       U32 forwardH;\r
 \r
 \r
        // Init \r
@@ -131,17 +130,34 @@ int LZ4_compressCtx(void** ctx,
                *ctx = (void*) srt;\r
        }\r
        HashTable = srt->hashTable;\r
-       memset(HashTable, 0, sizeof(srt->hashTable));\r
+       memset((void*)HashTable, 0, sizeof(srt->hashTable));\r
 \r
-       // Main Loop\r
-       while (ip < ilimit+1)\r
-       {\r
-               ref = HashTable[HASH_VALUE(ip)];\r
-               HashTable[HASH_VALUE(ip)] = ip;\r
 \r
-               // Min Match\r
-               if ((ref < ip - MAX_DISTANCE) || (*(U32*)ref != *(U32*)ip)) { ip += (skipped++) >> skipStrength ; continue; }\r
-               skipped = (1U << skipStrength) + 3;\r
+       // First Byte\r
+       HashTable[HASH_VALUE(ip)] = ip++;\r
+       forwardH = HASH_VALUE(ip);\r
+       \r
+       // Main Loop\r
+    for ( ; ; ) 
+       {
+               int segmentSize = (1U << skipStrength) + 3;
+               const BYTE* forwardIp = ip;
+               const BYTE* ref;
+
+               // Find a match\r
+               do {
+                       U32 h = forwardH;
+                       int skipped = segmentSize++ >> skipStrength;
+                       ip = forwardIp;
+                       forwardIp = ip + skipped;
+
+                       if (forwardIp > ilimit) { goto _last_literals; }
+\r
+                       forwardH = HASH_VALUE(forwardIp);\r
+                       ref = HashTable[h];\r
+                       HashTable[h] = ip;\r
+
+               } while ((ref < ip - MAX_DISTANCE) || (*(U32*)ref != *(U32*)ip));
 \r
                // Catch up\r
                while ((ip>anchor) && (ref>(BYTE*)source) && (ip[-1]==ref[-1])) { ip--; ref--; }  \r
@@ -190,15 +206,16 @@ _endCount:
 \r
                // Prepare next loop\r
                anchor = ip++; \r
+               forwardH = HASH_VALUE(ip);\r
        }\r
 \r
+_last_literals:\r
        // Encode Last Literals\r
-       len = iend - anchor;\r
-       if (len)\r
+       if (anchor < iend)\r
        {\r
-               orun=op++;\r
-               if (len>=(int)RUN_MASK) { *orun=(RUN_MASK<<ML_BITS); len-=RUN_MASK; for(; len > 254 ; len-=255) *op++ = 255; *op++ = (BYTE) len; } \r
-               else *orun = (len<<ML_BITS);\r
+               int lastLitRun = iend - anchor;\r
+               if (lastLitRun>=(int)RUN_MASK) { *op++=(RUN_MASK<<ML_BITS); lastLitRun-=RUN_MASK; for(; lastLitRun > 254 ; lastLitRun-=255) *op++ = 255; *op++ = (BYTE) lastLitRun; } \r
+               else *op++ = (lastLitRun<<ML_BITS);\r
                while (anchor < iend - 3) { *(U32*)op = *(U32*)anchor; op+=4; anchor+=4; }\r
                while (anchor < iend ) *op++ = *anchor++;\r
        }\r