From: Dougall Johnson Date: Mon, 22 Aug 2022 00:57:39 +0000 (+1000) Subject: Inflate: Increase max root table sizes to 10 and 9 X-Git-Tag: 2.1.0-beta1~166 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2d110b17b815016b5419592b7484ae9affb6fe68;p=thirdparty%2Fzlib-ng.git Inflate: Increase max root table sizes to 10 and 9 This increases the size of the `codes` array by 1920 bytes (33%), but improves performance a little. Root table size is still limited by the maximum code length in use, so tiny files typically see no change to table-building time, as they don't use longer codes. --- diff --git a/infback.c b/infback.c index 200997c4..f56db8e8 100644 --- a/infback.c +++ b/infback.c @@ -329,18 +329,18 @@ int32_t Z_EXPORT PREFIX(inflateBack)(PREFIX3(stream) *strm, in_func in, void *in } /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h + values here (10 and 9) without reading the comments in inftrees.h concerning the ENOUGH constants, which depend on those values */ state->next = state->codes; state->lencode = (const code *)(state->next); - state->lenbits = 9; + state->lenbits = 10; ret = zng_inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) { SET_BAD("invalid literal/lengths set"); break; } state->distcode = (const code *)(state->next); - state->distbits = 6; + state->distbits = 9; ret = zng_inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) { diff --git a/inflate.c b/inflate.c index 6085fffa..e109182f 100644 --- a/inflate.c +++ b/inflate.c @@ -820,18 +820,18 @@ int32_t Z_EXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int32_t flush) { } /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h + values here (10 and 9) without reading the comments in inftrees.h concerning the ENOUGH constants, which depend on those values */ state->next = state->codes; state->lencode = (const code *)(state->next); - state->lenbits = 9; + state->lenbits = 10; ret = zng_inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) { SET_BAD("invalid literal/lengths set"); break; } state->distcode = (const code *)(state->next); - state->distbits = 6; + state->distbits = 9; ret = zng_inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) { diff --git a/inftrees.h b/inftrees.h index bb6274a1..eeae9c6a 100644 --- a/inftrees.h +++ b/inftrees.h @@ -39,17 +39,17 @@ typedef struct { */ /* Maximum size of the dynamic table. The maximum number of code structures is - 1444, which is the sum of 852 for literal/length codes and 592 for distance + 1924, which is the sum of 1332 for literal/length codes and 592 for distance codes. These values were found by exhaustive searches using the program examples/enough.c found in the zlib distributions. The arguments to that program are the number of symbols, the initial root table size, and the - maximum bit length of a code. "enough 286 9 15" for literal/length codes - returns returns 852, and "enough 30 6 15" for distance codes returns 592. - The initial root table size (9 or 6) is found in the fifth argument of the + maximum bit length of a code. "enough 286 10 15" for literal/length codes + returns returns 1332, and "enough 30 9 15" for distance codes returns 592. + The initial root table size (10 or 9) is found in the fifth argument of the inflate_table() calls in inflate.c and infback.c. If the root table size is changed, then these maximum sizes would be need to be recalculated and updated. */ -#define ENOUGH_LENS 852 +#define ENOUGH_LENS 1332 #define ENOUGH_DISTS 592 #define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS)