blob: 763fb263cb4e17e4ef789dcf573b636aef9cfa22 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/ui/scenic/lib/scheduling/duration_predictor.h"
#include <lib/syslog/cpp/macros.h>
namespace scheduling {
DurationPredictor::DurationPredictor(size_t window_size, zx::duration initial_prediction)
: kWindowSize(window_size), window_(kWindowSize, initial_prediction) {
FX_DCHECK(kWindowSize > 0);
current_maximum_duration_index_ = kWindowSize - 1;
}
zx::duration DurationPredictor::GetPrediction() const {
return window_[current_maximum_duration_index_];
}
void DurationPredictor::InsertNewMeasurement(zx::duration duration) {
// Move window forward.
window_.push_front(duration);
window_.pop_back();
++current_maximum_duration_index_;
if (current_maximum_duration_index_ >= kWindowSize) {
// If old min went out of scope, find the new min.
current_maximum_duration_index_ = 0;
for (size_t i = 1; i < kWindowSize; ++i) {
if (window_[i] > window_[current_maximum_duration_index_]) {
current_maximum_duration_index_ = i;
}
}
} else if (window_.front() >= window_[current_maximum_duration_index_]) {
// Use newest possible maximum.
current_maximum_duration_index_ = 0;
}
}
} // namespace scheduling