Skip to content

Commit fd19e50

Browse files
hll6 merge speed improvement
1 parent 067f645 commit fd19e50

1 file changed

Lines changed: 13 additions & 4 deletions

File tree

hll/include/Hll8Array-internal.hpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,17 +97,26 @@ void Hll8Array<A>::mergeHll(const HllArray<A>& src) {
9797
// at this point src_k >= dst_k
9898
const uint32_t dst_mask = (1 << this->getLgConfigK()) - 1;
9999
// special treatment below to optimize performance
100-
// in particular to avoid a virtual method call in a loop
101100
if (src.getTgtHllType() == target_hll_type::HLL_8) {
102101
uint32_t i = 0;
103102
for (const auto value: src.getHllArray()) {
104103
processValue(i++, dst_mask, value);
105104
}
106105
} else if (src.getTgtHllType() == target_hll_type::HLL_6) {
107106
const uint32_t src_k = 1 << src.getLgConfigK();
108-
for (uint32_t i = 0; i < src_k; ++i) {
109-
const uint8_t new_v = static_cast<const Hll6Array<A>&>(src).getSlot(i);
110-
processValue(i, dst_mask, new_v);
107+
uint32_t i = 0;
108+
const uint8_t* ptr = src.getHllArray().data();
109+
while (i < src_k) {
110+
uint8_t value = *ptr & 0x3f;
111+
processValue(i++, dst_mask, value);
112+
value = *ptr++ >> 6;
113+
value |= (*ptr & 0x0f) << 2;
114+
processValue(i++, dst_mask, value);
115+
value = *ptr++ >> 4;
116+
value |= (*ptr & 3) << 4;
117+
processValue(i++, dst_mask, value);
118+
value = *ptr++ >> 2;
119+
processValue(i++, dst_mask, value);
111120
}
112121
} else { // HLL_4
113122
const auto& src4 = static_cast<const Hll4Array<A>&>(src);

0 commit comments

Comments
 (0)