summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2014-04-14 12:58:46 +0200
committerantirez <antirez@gmail.com>2014-04-14 12:58:46 +0200
commitdb40da0a47ef924ea26ceb9bb73ffa121c20031c (patch)
tree060257a53b8498196154a01daed0ca05b3107d2e
parent4e0a99ba51cf22ae695187e9215796f1c645a253 (diff)
downloadredis-db40da0a47ef924ea26ceb9bb73ffa121c20031c.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. */