Allocate memory up front for histogram copy

This commit is contained in:
2025-09-01 17:06:08 -04:00
parent 31e751fe75
commit d502f66bb4

View File

@@ -1083,21 +1083,21 @@ compute_metric_values(ArenaAllocator &arena, const LabelSets &label_sets) {
auto *instance = it->second; auto *instance = it->second;
// Extract data under lock - minimize critical section // Extract data under lock - minimize critical section
ArenaVector<uint64_t> counts_snapshot(&arena); uint64_t *counts_snapshot = arena.allocate<uint64_t>(bucket_count);
double sum_snapshot; double sum_snapshot;
uint64_t observations_snapshot; uint64_t observations_snapshot;
{ {
std::lock_guard<std::mutex> lock(instance->mutex); std::lock_guard<std::mutex> lock(instance->mutex);
for (size_t i = 0; i < instance->counts.size(); ++i) { for (size_t i = 0; i < instance->counts.size(); ++i) {
counts_snapshot.push_back(instance->counts[i]); counts_snapshot[i] = instance->counts[i];
} }
sum_snapshot = instance->sum; sum_snapshot = instance->sum;
observations_snapshot = instance->observations; observations_snapshot = instance->observations;
} }
// Add to totals // Add to totals
for (size_t i = 0; i < counts_snapshot.size(); ++i) { for (size_t i = 0; i < bucket_count; ++i) {
total_counts[i] += counts_snapshot[i]; total_counts[i] += counts_snapshot[i];
} }
total_sum += sum_snapshot; total_sum += sum_snapshot;