A few memory system performance enhancements.
base/compression/lzss_compression.cc: base/compression/lzss_compression.hh: Rework for better performance --HG-- extra : convert_revision : b13d706e0e23cbe7122b611258354c66cf5f3c70
This commit is contained in:
parent
b18a36a6f2
commit
81882c0d10
2 changed files with 29 additions and 23 deletions
|
@ -36,21 +36,32 @@
|
|||
|
||||
#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);
|
||||
|
|
|
@ -41,14 +41,15 @@
|
|||
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
|
||||
|
|
Loading…
Reference in a new issue