summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Moinvaziri <nathan@nathanm.com>2020-04-21 10:29:37 -0700
committerHans Kristian Rosbach <hk-github@circlestorm.org>2020-04-30 10:01:46 +0200
commit0129e88cee5f5ac295c311d5d94f2bb6a2f475f6 (patch)
treef8ea2b566104af729458240ec415d8a5812b438e
parent51e695092d18cae456af802bec106192f73d9bf6 (diff)
downloadProject-Tick-0129e88cee5f5ac295c311d5d94f2bb6a2f475f6.tar.gz
Project-Tick-0129e88cee5f5ac295c311d5d94f2bb6a2f475f6.zip
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.
-rw-r--r--insert_string.c15
-rw-r--r--insert_string_tpl.h6
2 files changed, 4 insertions, 17 deletions
diff --git a/insert_string.c b/insert_string.c
index 4e4c628bfb..e9efd517f8 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 0e90c3b00d..c80c9f8ba0 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;