summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2014-04-14 12:58:46 +0200
committerantirez <antirez@gmail.com>2014-04-16 15:26:27 +0200
commit4244aa29f9ec9a44f2028153aa5ad31a45e763eb (patch)
tree346ccc5ac338ba307195bd2c019b330ad8fc4874
parent4cd11077d2dda4b3dfa7ca960825a6a36afc9ae9 (diff)
downloadredis-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.c19
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. */