A few memory system performance enhancements.
authorErik Hallnor <ehallnor@umich.edu>
Wed, 24 Mar 2004 09:41:19 +0000 (04:41 -0500)
committerErik Hallnor <ehallnor@umich.edu>
Wed, 24 Mar 2004 09:41:19 +0000 (04:41 -0500)
base/compression/lzss_compression.cc:
base/compression/lzss_compression.hh:
    Rework for better performance

--HG--
extra : convert_revision : b13d706e0e23cbe7122b611258354c66cf5f3c70

base/compression/lzss_compression.cc
base/compression/lzss_compression.hh

index 8f235b80878c2850d9cd8ca7aa9fcf3a8a72625b..2f6c5d3383fccf0279bde964c599c65508fe79f7 100644 (file)
 
 #include "base/misc.hh" //for fatal
 
-int
-LZSSCompression::findSubString(uint8_t *src, int front, int back, int size)
+void
+LZSSCompression::findSubString(uint8_t *src, int back, int size, uint16_t &L,
+                               uint16_t &P)
 {
-    int subSize = 0;
-    int max_length = 2048;
-    if (size - back < max_length) {
-        max_length = size - back;
-    }
-    for (int i = 0; i < max_length; ++i) {
-        if (src[front+i] != src[back+i]) {
-            return subSize;
+    int front = 0;
+    int max_length = size - back;
+    L = 0;
+    P = back - 1;
+    while (front < back) {
+        while (src[front] != src[back] && front < back) ++front;
+        if (front >= back) {
+            return;
+        }
+        int i = 1;
+        while (src[front+i] == src[back+i] && i < max_length) ++i;
+        if (i >= L) {
+            L = i;
+            P = front;
+        }
+        if (src[front+i] != src[back+i-1]) {
+            // can't find a longer substring until past this point.
+            front += i;
+        } else {
+            ++front;
         }
-        ++subSize;
     }
-    return subSize;
 }
 
 int
@@ -106,13 +117,7 @@ LZSSCompression::compress(uint8_t *dest, uint8_t *src, int size)
             ++i;
             continue;
         }
-        for (int j = 0; j < i; ++j) {
-            int sub_size = findSubString(src, j, i, size);
-            if (sub_size >= L) {
-                L = sub_size;
-                P = j;
-            }
-        }
+        findSubString(src, i, size, L, P);
         if (L > 1) {
             // Output the string reference
             emitString(&dest[dest_index], P, L);
index 755a52c9201a2b55a712b791059f2a0b3b1d554d..9707a8acac618f60c724405ce4360bed6937be0a 100644 (file)
 class LZSSCompression
 {
     /**
-     * Finds the longest substrings that start at the given offsets.
+     * Finds the longest substring for the given offset.
      * @param src The source block that we search for substrings.
-     * @param front The smaller offset.
      * @param back The larger offset.
      * @param size The size of the source block.
-     * @return The size of the longest substring.
+     * @param L The length of the largest substring.
+     * @param P The starting offset of the largest substring.
      */
-    int findSubString(uint8_t *src, int front, int back, int size);
+    void findSubString(uint8_t *src, int back, int size, uint16_t &L,
+                       uint16_t &P);
 
     /**
      * Emit an encoded byte to the compressed data array. If the 2 high