blob: 46f2091a9d405e69d760a38e288ba1c1cff1a078 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/services/heap_profiling/public/cpp/merge_samples.h"
#include <algorithm>
#include <cmath>
namespace heap_profiling {
namespace {
using Sample = base::SamplingHeapProfiler::Sample;
}
bool SampleComparator::operator()(const Sample& lhs, const Sample& rhs) const {
// We consider two samples to be equal if and only if their stacks are equal.
// Note that equal stack implies equal allocator. It's technically possible
// for two equal stacks to have different thread names, but it's an edge
// condition and marking them as equal will not significantly change analysis.
return lhs.stack < rhs.stack;
}
// Merges samples that have identical stack traces, excluding total and size.
SampleMap MergeSamples(const std::vector<Sample>& samples) {
SampleMap results;
for (const Sample& sample : samples) {
size_t count = std::max<size_t>(
static_cast<size_t>(
std::llround(static_cast<double>(sample.total) / sample.size)),
1);
// Either update the existing entry or construct a new entry [with default
// initializer 0].
SampleValue& value = results[sample];
value.total += sample.total;
value.count += count;
}
return results;
}
} // namespace heap_profiling