From: Nathan Moinvaziri Date: Tue, 21 Apr 2020 17:29:37 +0000 (-0700) Subject: Removed TRIGGER_LEVEL byte masking from INSERT_STRING and UPDATE_HASH due to poor... X-Git-Tag: 1.9.9-b1~320 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0129e88cee5f5ac295c311d5d94f2bb6a2f475f6;p=thirdparty%2Fzlib-ng.git Removed TRIGGER_LEVEL byte masking from INSERT_STRING and UPDATE_HASH due to poor performance on levels 6 and 9 especially with optimized versions of UPDATE_HASH. From commit d306c75d3bb36cba73aec9b3b3ca378e31d1799e: .. we hash 4 bytes, instead of 3, for certain levels. This shortens the hash chains, and also improves the quality of each hash entry. --- diff --git a/insert_string.c b/insert_string.c index 4e4c628bf..e9efd517f 100644 --- a/insert_string.c +++ b/insert_string.c @@ -17,17 +17,10 @@ #if defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86) # define UPDATE_HASH(s, h, val) \ - do {\ - if (s->level < TRIGGER_LEVEL)\ - h = (3483 * ((val) & 0xff) +\ - 23081* (((val) >> 8) & 0xff) +\ - 6954 * (((val) >> 16) & 0xff) +\ - 20947* (((val) >> 24) & 0xff));\ - else\ - h = (25881* (((val)) & 0xff) +\ - 24674* (((val) >> 8) & 0xff) +\ - 25811* (((val) >> 16) & 0xff));\ - } while (0) + h = (3483 * ((val) & 0xff) +\ + 23081 * (((val) >> 8) & 0xff) +\ + 6954 * (((val) >> 16) & 0xff) +\ + 20947 * (((val) >> 24) & 0xff)); #else # define UPDATE_HASH(s, h, val)\ h = (s->ins_h = ((s->ins_h << s->hash_shift) ^ ((val) >> ((MIN_MATCH - 1) * 8))) & s->hash_mask) diff --git a/insert_string_tpl.h b/insert_string_tpl.h index 0e90c3b00..c80c9f8ba 100644 --- a/insert_string_tpl.h +++ b/insert_string_tpl.h @@ -41,9 +41,6 @@ ZLIB_INTERNAL Pos QUICK_INSERT_STRING(deflate_state *const s, const Pos str) { val |= ((uint32_t)s->window[str+3] << 24); #endif - if (s->level >= TRIGGER_LEVEL) - val &= 0xFFFFFF; - UPDATE_HASH(s, h, val); hm = h & s->hash_mask; @@ -87,9 +84,6 @@ ZLIB_INTERNAL Pos INSERT_STRING(deflate_state *const s, const Pos str, unsigned val |= ((uint32_t)(strstart[3]) << 24); #endif - if (s->level >= TRIGGER_LEVEL) - val &= 0xFFFFFF; - UPDATE_HASH(s, h, val); hm = h & s->hash_mask;