提交 3f5cd0c6 编写于 作者: A antirez

Speedup SUM(2^-reg[m]) in HyperLogLog computation.

When the register is set to zero, we need to add 2^-0 to E, which is 1,
but it is faster to just add 'ez' at the end, which is the number of
registers set to zero, a value we need to compute anyway.
上级 f0eca148
...@@ -546,11 +546,12 @@ double hllDenseSum(uint8_t *registers, double *PE, int *ezp) { ...@@ -546,11 +546,12 @@ double hllDenseSum(uint8_t *registers, double *PE, int *ezp) {
HLL_DENSE_GET_REGISTER(reg,registers,j); HLL_DENSE_GET_REGISTER(reg,registers,j);
if (reg == 0) { if (reg == 0) {
ez++; ez++;
E += 1; /* 2^(-reg[j]) is 1 when m is 0. */ /* Increment E at the end of the loop. */
} else { } else {
E += PE[reg]; /* Precomputed 2^(-reg[j]). */ E += PE[reg]; /* Precomputed 2^(-reg[j]). */
} }
} }
E += ez; /* Add 2^0 'ez' times. */
} }
*ezp = ez; *ezp = ez;
return E; return E;
...@@ -894,13 +895,13 @@ double hllSparseSum(uint8_t *sparse, int sparselen, double *PE, int *ezp, int *i ...@@ -894,13 +895,13 @@ double hllSparseSum(uint8_t *sparse, int sparselen, double *PE, int *ezp, int *i
runlen = HLL_SPARSE_ZERO_LEN(p); runlen = HLL_SPARSE_ZERO_LEN(p);
idx += runlen; idx += runlen;
ez += runlen; ez += runlen;
E += 1*runlen; /* 2^(-reg[j]) is 1 when m is 0. */ /* Increment E at the end of the loop. */
p++; p++;
} else if (HLL_SPARSE_IS_XZERO(p)) { } else if (HLL_SPARSE_IS_XZERO(p)) {
runlen = HLL_SPARSE_XZERO_LEN(p); runlen = HLL_SPARSE_XZERO_LEN(p);
idx += runlen; idx += runlen;
ez += runlen; ez += runlen;
E += 1*runlen; /* 2^(-reg[j]) is 1 when m is 0. */ /* Increment E at the end of the loop. */
p += 2; p += 2;
} else { } else {
runlen = HLL_SPARSE_VAL_LEN(p); runlen = HLL_SPARSE_VAL_LEN(p);
...@@ -911,6 +912,7 @@ double hllSparseSum(uint8_t *sparse, int sparselen, double *PE, int *ezp, int *i ...@@ -911,6 +912,7 @@ double hllSparseSum(uint8_t *sparse, int sparselen, double *PE, int *ezp, int *i
} }
} }
if (idx != HLL_REGISTERS && invalid) *invalid = 1; if (idx != HLL_REGISTERS && invalid) *invalid = 1;
E += ez; /* Add 2^0 'ez' times. */
*ezp = ez; *ezp = ez;
return E; return E;
} }
...@@ -932,11 +934,13 @@ double hllRawSum(uint8_t *registers, double *PE, int *ezp) { ...@@ -932,11 +934,13 @@ double hllRawSum(uint8_t *registers, double *PE, int *ezp) {
reg = registers[j]; reg = registers[j];
if (reg == 0) { if (reg == 0) {
ez++; ez++;
E += 1; /* 2^(-reg[j]) is 1 when m is 0. */ /* Increment E at the end of the loop. */
} else { } else {
E += PE[reg]; /* Precomputed 2^(-reg[j]). */ E += PE[reg]; /* Precomputed 2^(-reg[j]). */
} }
} }
E += ez; /* 2^(-reg[j]) is 1 when m is 0, add it 'ez' times for every
zero register in the HLL. */
*ezp = ez; *ezp = ez;
return E; return E;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册