blob: ce8dee9087546b7054025c9a5129cc11eb47bbca [file] [log] [blame]
// Copyright 2015 The Chromium 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 "components/scheduler/renderer/task_cost_estimator.h"
#include "base/time/default_tick_clock.h"
namespace scheduler {
TaskCostEstimator::TaskCostEstimator(base::TickClock* time_source,
int sample_count,
double estimation_percentile)
: rolling_time_delta_history_(sample_count),
time_source_(time_source),
outstanding_task_count_(0),
estimation_percentile_(estimation_percentile) {}
TaskCostEstimator::~TaskCostEstimator() {}
void TaskCostEstimator::WillProcessTask(const base::PendingTask& pending_task) {
// Avoid measuring the duration in nested run loops.
if (++outstanding_task_count_ == 1)
task_start_time_ = time_source_->NowTicks();
}
void TaskCostEstimator::DidProcessTask(const base::PendingTask& pending_task) {
if (--outstanding_task_count_ == 0) {
base::TimeDelta duration = time_source_->NowTicks() - task_start_time_;
rolling_time_delta_history_.InsertSample(duration);
}
}
base::TimeDelta TaskCostEstimator::expected_task_duration() const {
return rolling_time_delta_history_.Percentile(estimation_percentile_);
}
void TaskCostEstimator::Clear() {
rolling_time_delta_history_.Clear();
expected_task_duration_ = base::TimeDelta();
}
} // namespace scheduler