diff options
author | Evgenii Kliuchnikov <eustas@google.com> | 2023-08-03 04:58:16 -0700 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2023-08-03 04:58:52 -0700 |
commit | a560089843ad59f41315b7cf8b11632c510f73a9 (patch) | |
tree | 4c801a31b1ebc11cbdd37b58f7a6643eb9b227f7 | |
parent | 0b89871d86ac0b0d8110bd3737eaa22b406c3287 (diff) | |
download | brotli-a560089843ad59f41315b7cf8b11632c510f73a9.zip brotli-a560089843ad59f41315b7cf8b11632c510f73a9.tar.gz brotli-a560089843ad59f41315b7cf8b11632c510f73a9.tar.bz2 |
speedup q5-9 on large files
PiperOrigin-RevId: 553440457
-rw-r--r-- | c/enc/hash_longest_match64_inc.h | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/c/enc/hash_longest_match64_inc.h b/c/enc/hash_longest_match64_inc.h index ea5a831..e48fc61 100644 --- a/c/enc/hash_longest_match64_inc.h +++ b/c/enc/hash_longest_match64_inc.h @@ -217,8 +217,12 @@ static BROTLI_INLINE void FN(FindLongestMatch)( const size_t down = (num[key] > self->block_size_) ? (num[key] - self->block_size_) : 0u; - for (i = num[key]; i > down;) { + const uint32_t first4 = BrotliUnalignedRead32(data + cur_ix_masked); + const size_t max_length_m4 = max_length - 4; + i = num[key]; + for (; i > down;) { size_t prev_ix = bucket[--i & self->block_mask_]; + uint32_t current4; const size_t backward = cur_ix - prev_ix; if (BROTLI_PREDICT_FALSE(backward > max_backward)) { break; @@ -229,22 +233,19 @@ static BROTLI_INLINE void FN(FindLongestMatch)( data[cur_ix_masked + best_len] != data[prev_ix + best_len]) { continue; } + current4 = BrotliUnalignedRead32(data + prev_ix); + if (first4 != current4) continue; { - const size_t len = FindMatchLengthWithLimit(&data[prev_ix], - &data[cur_ix_masked], - max_length); - if (len >= 4) { - /* Comparing for >= 3 does not change the semantics, but just saves - for a few unnecessary binary logarithms in backward reference - score, since we are not interested in such short matches. */ - score_t score = BackwardReferenceScore(len, backward); - if (best_score < score) { - best_score = score; - best_len = len; - out->len = best_len; - out->distance = backward; - out->score = best_score; - } + const size_t len = FindMatchLengthWithLimit(&data[prev_ix + 4], + &data[cur_ix_masked + 4], + max_length_m4) + 4; + const score_t score = BackwardReferenceScore(len, backward); + if (best_score < score) { + best_score = score; + best_len = len; + out->len = best_len; + out->distance = backward; + out->score = best_score; } } } |