diff --git a/be/src/exprs/aggregate/aggregate_function_uniq.h b/be/src/exprs/aggregate/aggregate_function_uniq.h index 4f10bc9f2ceece..7de1732c1ca48c 100644 --- a/be/src/exprs/aggregate/aggregate_function_uniq.h +++ b/be/src/exprs/aggregate/aggregate_function_uniq.h @@ -164,13 +164,19 @@ class AggregateFunctionUniq final array_of_data_set[i] = &(this->data(places[i] + place_offset).set); } + // Precompute hash values to avoid double computation in prefetch + insert + std::vector hash_values(batch_size); + for (size_t i = 0; i < batch_size; ++i) { + hash_values[i] = array_of_data_set[i]->hash(keys[i]); + } + for (size_t i = 0; i != batch_size; ++i) { if (i + HASH_MAP_PREFETCH_DIST < batch_size) { - array_of_data_set[i + HASH_MAP_PREFETCH_DIST]->prefetch( - keys[i + HASH_MAP_PREFETCH_DIST]); + array_of_data_set[i + HASH_MAP_PREFETCH_DIST]->prefetch_hash( + hash_values[i + HASH_MAP_PREFETCH_DIST]); } - array_of_data_set[i]->insert(keys[i]); + array_of_data_set[i]->emplace_with_hash(hash_values[i], keys[i]); } } @@ -193,11 +199,17 @@ class AggregateFunctionUniq final const KeyType* keys = get_keys(keys_container, *columns[0], batch_size); auto& set = this->data(place).set; + // Precompute hash values to avoid double computation in prefetch + insert + std::vector hash_values(batch_size); + for (size_t i = 0; i < batch_size; ++i) { + hash_values[i] = set.hash(keys[i]); + } + for (size_t i = 0; i != batch_size; ++i) { if (i + HASH_MAP_PREFETCH_DIST < batch_size) { - set.prefetch(keys[i + HASH_MAP_PREFETCH_DIST]); + set.prefetch_hash(hash_values[i + HASH_MAP_PREFETCH_DIST]); } - set.insert(keys[i]); + set.emplace_with_hash(hash_values[i], keys[i]); } } diff --git a/be/src/exprs/aggregate/aggregate_function_uniq_distribute_key.h b/be/src/exprs/aggregate/aggregate_function_uniq_distribute_key.h index 8d44d74d03e22b..35c2f5f7f2a0f6 100644 --- a/be/src/exprs/aggregate/aggregate_function_uniq_distribute_key.h +++ b/be/src/exprs/aggregate/aggregate_function_uniq_distribute_key.h @@ -122,13 +122,19 @@ class AggregateFunctionUniqDistributeKey final array_of_data_set[i] = &(this->data(places[i] + place_offset).set); } + // Precompute hash values to avoid double computation in prefetch + insert + std::vector hash_values(batch_size); + for (size_t i = 0; i < batch_size; ++i) { + hash_values[i] = array_of_data_set[i]->hash(keys[i]); + } + for (size_t i = 0; i != batch_size; ++i) { if (i + HASH_MAP_PREFETCH_DIST < batch_size) { - array_of_data_set[i + HASH_MAP_PREFETCH_DIST]->prefetch( - keys[i + HASH_MAP_PREFETCH_DIST]); + array_of_data_set[i + HASH_MAP_PREFETCH_DIST]->prefetch_hash( + hash_values[i + HASH_MAP_PREFETCH_DIST]); } - array_of_data_set[i]->insert(keys[i]); + array_of_data_set[i]->emplace_with_hash(hash_values[i], keys[i]); } } @@ -138,11 +144,17 @@ class AggregateFunctionUniqDistributeKey final const KeyType* keys = get_keys(keys_container, *columns[0], batch_size); auto& set = this->data(place).set; + // Precompute hash values to avoid double computation in prefetch + insert + std::vector hash_values(batch_size); + for (size_t i = 0; i < batch_size; ++i) { + hash_values[i] = set.hash(keys[i]); + } + for (size_t i = 0; i != batch_size; ++i) { if (i + HASH_MAP_PREFETCH_DIST < batch_size) { - set.prefetch(keys[i + HASH_MAP_PREFETCH_DIST]); + set.prefetch_hash(hash_values[i + HASH_MAP_PREFETCH_DIST]); } - set.insert(keys[i]); + set.emplace_with_hash(hash_values[i], keys[i]); } }