blob: 8168c3754c7a1e26bff3a4d67f255ee6d66223aa [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/page_load_metrics/browser/responsiveness_metrics_normalization.h"
namespace page_load_metrics {
ResponsivenessMetricsNormalization::ResponsivenessMetricsNormalization() =
default;
ResponsivenessMetricsNormalization::~ResponsivenessMetricsNormalization() =
default;
std::optional<mojom::UserInteractionLatency>
ResponsivenessMetricsNormalization::ApproximateHighPercentile() const {
std::optional<mojom::UserInteractionLatency> approximate_high_percentile;
if (worst_ten_latencies_.size()) {
uint64_t index =
std::min(static_cast<uint64_t>(worst_ten_latencies_.size() - 1),
static_cast<uint64_t>(num_user_interactions_ /
kHighPercentileUpdateFrequency));
approximate_high_percentile = worst_ten_latencies_[index];
}
return approximate_high_percentile;
}
std::optional<mojom::UserInteractionLatency>
ResponsivenessMetricsNormalization::worst_latency() const {
std::optional<mojom::UserInteractionLatency> worst_latency;
if (worst_ten_latencies_.size()) {
worst_latency = worst_ten_latencies_[0];
}
return worst_latency;
}
void ResponsivenessMetricsNormalization::AddNewUserInteractionLatencies(
const std::vector<mojom::UserInteractionLatencyPtr>& max_event_durations) {
num_user_interactions_ += max_event_durations.size();
// Normalize max event durations.
NormalizeUserInteractionLatencies(max_event_durations);
}
void ResponsivenessMetricsNormalization::ClearAllUserInteractionLatencies() {
num_user_interactions_ = 0;
worst_ten_latencies_ = std::vector<mojom::UserInteractionLatency>();
}
void ResponsivenessMetricsNormalization::NormalizeUserInteractionLatencies(
const std::vector<mojom::UserInteractionLatencyPtr>&
user_interaction_latencies) {
// Insert each latency into the list if it is one of the worst ten seen so
// far. Use inplace_merge to keep the list sorted after appending an element.
for (const mojom::UserInteractionLatencyPtr& user_interaction :
user_interaction_latencies) {
if (worst_ten_latencies_.size() < 10) {
worst_ten_latencies_.push_back(*user_interaction);
} else if (user_interaction->interaction_latency >
worst_ten_latencies_.back().interaction_latency) {
worst_ten_latencies_.back() = *user_interaction;
} else {
continue;
}
if (worst_ten_latencies_.size() > 1) {
std::inplace_merge(
worst_ten_latencies_.begin(), std::prev(worst_ten_latencies_.end()),
worst_ten_latencies_.end(),
[](const auto& latency1, const auto& latency2) {
return latency1.interaction_latency > latency2.interaction_latency;
});
}
}
}
} // namespace page_load_metrics