@@ -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