1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
// 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(
uint64_t num_new_interactions,
const mojom::UserInteractionLatencies& max_event_durations) {
num_user_interactions_ += num_new_interactions;
// 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 mojom::UserInteractionLatencies& user_interaction_latencies) {
DCHECK(user_interaction_latencies.is_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.get_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
|