diff options
author | antirez <antirez@gmail.com> | 2014-04-14 12:58:46 +0200 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2014-04-16 15:26:27 +0200 |
commit | 4244aa29f9ec9a44f2028153aa5ad31a45e763eb (patch) | |
tree | 346ccc5ac338ba307195bd2c019b330ad8fc4874 | |
parent | 4cd11077d2dda4b3dfa7ca960825a6a36afc9ae9 (diff) | |
download | redis-4244aa29f9ec9a44f2028153aa5ad31a45e763eb.tar.gz |
hllSparseAdd(): faster code removing conditional.
Bottleneck found profiling. Big run time improvement found when testing
after the change.
-rw-r--r-- | src/hyperloglog.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/hyperloglog.c b/src/hyperloglog.c index 06afc3637..aa0ae64c9 100644 --- a/src/hyperloglog.c +++ b/src/hyperloglog.c @@ -202,7 +202,7 @@ struct hllhdr { #define HLL_SPARSE 1 /* Sparse encoding */ #define HLL_MAX_ENCODING 1 -#define HLL_SPARSE_MAX 3000 +#define HLL_SPARSE_MAX 12000 /* =========================== Low level bit macros ========================= */ @@ -663,14 +663,23 @@ int hllSparseAdd(robj *o, unsigned char *ele, size_t elesize) { next = NULL; /* Points to the next opcode at the end of the loop. */ span = 0; while(p < end) { + int oplen; + /* Set span to the number of registers covered by this opcode. */ - if (HLL_SPARSE_IS_ZERO(p)) span = HLL_SPARSE_ZERO_LEN(p); - else if (HLL_SPARSE_IS_XZERO(p)) span = HLL_SPARSE_XZERO_LEN(p); - else span = HLL_SPARSE_VAL_LEN(p); + if (HLL_SPARSE_IS_ZERO(p)) { + span = HLL_SPARSE_ZERO_LEN(p); + oplen = 1; + } else if (HLL_SPARSE_IS_XZERO(p)) { + span = HLL_SPARSE_XZERO_LEN(p); + oplen = 2; + } else { + span = HLL_SPARSE_VAL_LEN(p); + oplen = 1; + } /* Break if this opcode covers the register as 'index'. */ if (index <= first+span-1) break; prev = p; - p += (HLL_SPARSE_IS_XZERO(p)) ? 2 : 1; + p += oplen; first += span; } if (span == 0) return -1; /* Invalid format. */ |