[PATCH RFC] 2.5.73 zlib #1 memmove

Jörn Engel (joern@wohnheim.fh-wedel.de)
Tue, 1 Jul 2003 17:45:22 +0200


[ I currently have some mail problems that might take a while to
resolve. wohnheim.fh-wedel.de has a new dns-entry and the old one
has a max lifetime on one week. :(

I'm trying to resolve that problem but please keep linux-kernel on
CC:. That way I can at least read the archives until the problems
are history. ]

Joakim found a performance issue in the zlib and after some back and
forth, it appears that memmove() should be the correct solution.

The code in question copies a string from the LZ77 sliding window into
the output buffer. The string is 3-258 bytes long with a tendency
towards small strings. The zlib uses this code to do the copy:

*q++ = *r++; c--;
*q++ = *r++; c--;
do {
*q++ = *r++;
} while (--c);

The first two lines are loop unrolling. Apart from being ugly, this
should also be slower than memmove(), so I propose this patch.

Jörn

-- 
Fantasy is more important than knowlegde. Knowlegde is limited,
while fantasy embraces the whole world.
-- Albert Einstein

--- linux-2.5.73/lib/zlib_inflate/inffast.c~zlib_memcpy 2003-06-30 03:51:54.000000000 +0200 +++ linux-2.5.73/lib/zlib_inflate/inffast.c 2003-06-30 04:22:32.000000000 +0200 @@ -20,6 +20,14 @@ #define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<<k;k+=8;}} #define UNGRAB {c=z->avail_in-n;c=(k>>3)<c?k>>3:c;n+=c;p-=c;k-=c<<3;} +static inline void memmove_update(Byte **dest, Byte **src, size_t *n) +{ + memmove(*dest, *src, *n); + *dest += *n; + *src += *n; + *n = 0; +} + /* Called with number of bytes left to write in window at least 258 (the maximum string length) and number of input bytes available at least ten. The ten bytes are six bytes for the longest length/ @@ -100,30 +108,18 @@ if (c > e) { c -= e; /* wrapped copy */ - do { - *q++ = *r++; - } while (--e); + memmove_update(&q, &r, &e); r = s->window; - do { - *q++ = *r++; - } while (--c); + memmove_update(&q, &r, &c); } else /* normal copy */ { - *q++ = *r++; c--; - *q++ = *r++; c--; - do { - *q++ = *r++; - } while (--c); + memmove_update(&q, &r, &c); } } else /* normal copy */ { - *q++ = *r++; c--; - *q++ = *r++; c--; - do { - *q++ = *r++; - } while (--c); + memmove_update(&q, &r, &c); } break; } - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/