Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(226)

Unified Diff: components/scheduler/renderer/renderer_scheduler_impl.cc

Issue 1381273002: A better idle time estimator (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/scheduler/renderer/renderer_scheduler_impl.cc
diff --git a/components/scheduler/renderer/renderer_scheduler_impl.cc b/components/scheduler/renderer/renderer_scheduler_impl.cc
index 1193339bddd77a356fad476e9166816153690ab1..b2ee0e11a3ff418fa66744dc60267ac56082a903 100644
--- a/components/scheduler/renderer/renderer_scheduler_impl.cc
+++ b/components/scheduler/renderer/renderer_scheduler_impl.cc
@@ -20,7 +20,7 @@ const double kLoadingTaskEstimationPercentile = 90;
const int kTimerTaskEstimationSampleCount = 200;
const double kTimerTaskEstimationPercentile = 90;
const int kShortIdlePeriodDurationSampleCount = 10;
-const double kShortIdlePeriodDurationPercentile = 20;
+const double kShortIdlePeriodDurationPercentile = 50;
}
RendererSchedulerImpl::RendererSchedulerImpl(
@@ -57,14 +57,13 @@ RendererSchedulerImpl::RendererSchedulerImpl(
default_loading_task_runner_ = NewLoadingTaskRunner("default_loading_tq");
default_timer_task_runner_ = NewTimerTaskRunner("default_timer_tq");
+ compositor_task_runner_->AddTaskObserver(
+ &MainThreadOnly().idle_time_estimator);
+
TRACE_EVENT_OBJECT_CREATED_WITH_ID(
TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler",
this);
- // Make sure that we don't initially assume there is no idle time.
- MainThreadOnly().short_idle_period_duration.InsertSample(
- cc::BeginFrameArgs::DefaultInterval());
-
helper_.SetObserver(this);
}
@@ -99,7 +98,8 @@ RendererSchedulerImpl::MainThreadOnly::MainThreadOnly()
kLoadingTaskEstimationPercentile),
timer_task_cost_estimator(kTimerTaskEstimationSampleCount,
kTimerTaskEstimationPercentile),
- short_idle_period_duration(kShortIdlePeriodDurationSampleCount),
+ idle_time_estimator(kShortIdlePeriodDurationSampleCount,
+ kShortIdlePeriodDurationPercentile),
current_use_case(UseCase::NONE),
timer_queue_suspend_count(0),
navigation_task_expected_count(0),
@@ -240,16 +240,9 @@ void RendererSchedulerImpl::DidCommitFrameToCompositor() {
idle_helper_.StartIdlePeriod(
IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, now,
MainThreadOnly().estimated_next_frame_begin);
- MainThreadOnly().short_idle_period_duration.InsertSample(
- MainThreadOnly().estimated_next_frame_begin - now);
- } else {
- // There was no idle time :(
- MainThreadOnly().short_idle_period_duration.InsertSample(base::TimeDelta());
}
- MainThreadOnly().expected_short_idle_period_duration =
- MainThreadOnly().short_idle_period_duration.Percentile(
- kShortIdlePeriodDurationPercentile);
+ MainThreadOnly().idle_time_estimator.DidCommitFrameToCompositor();
}
void RendererSchedulerImpl::BeginFrameNotExpectedSoon() {
@@ -561,12 +554,12 @@ void RendererSchedulerImpl::UpdatePolicyLocked(UpdateType update_type) {
bool loading_tasks_seem_expensive =
MainThreadOnly().loading_task_cost_estimator.expected_task_duration() >
- MainThreadOnly().expected_short_idle_period_duration;
+ MainThreadOnly().idle_time_estimator.expected_idle_duration();
MainThreadOnly().loading_tasks_seem_expensive = loading_tasks_seem_expensive;
bool timer_tasks_seem_expensive =
MainThreadOnly().timer_task_cost_estimator.expected_task_duration() >
- MainThreadOnly().expected_short_idle_period_duration;
+ MainThreadOnly().idle_time_estimator.expected_idle_duration();
MainThreadOnly().timer_tasks_seem_expensive = timer_tasks_seem_expensive;
// The |new_policy_duration| is the minimum of |expected_use_case_duration|
@@ -639,7 +632,8 @@ void RendererSchedulerImpl::UpdatePolicyLocked(UpdateType update_type) {
if (block_expensive_tasks && loading_tasks_seem_expensive)
new_policy.loading_queue_priority = TaskQueue::DISABLED_PRIORITY;
- if (MainThreadOnly().timer_queue_suspend_count != 0 ||
+ if ((block_expensive_tasks && timer_tasks_seem_expensive) ||
+ MainThreadOnly().timer_queue_suspend_count != 0 ||
MainThreadOnly().timer_queue_suspended_when_backgrounded) {
new_policy.timer_queue_priority = TaskQueue::DISABLED_PRIORITY;
}
@@ -838,9 +832,10 @@ RendererSchedulerImpl::AsValueLocked(base::TimeTicks optional_now) const {
.timer_task_cost_estimator.expected_task_duration()
.InMillisecondsF());
// TODO(skyostil): Can we somehow trace how accurate these estimates were?
- state->SetDouble(
- "expected_short_idle_period_duration",
- MainThreadOnly().expected_short_idle_period_duration.InMillisecondsF());
+ state->SetDouble("idle_time_estimator",
Sami 2015/10/03 00:56:15 nit: expected_idle_duration instead of idle_time_e
alex clarke (OOO till 29th) 2015/10/05 17:32:19 Done.
+ MainThreadOnly()
+ .idle_time_estimator.expected_idle_duration()
+ .InMillisecondsF());
state->SetDouble(
"estimated_next_frame_begin",
(MainThreadOnly().estimated_next_frame_begin - base::TimeTicks())
@@ -917,10 +912,7 @@ void RendererSchedulerImpl::ResetForNavigationLocked() {
any_thread_lock_.AssertAcquired();
MainThreadOnly().loading_task_cost_estimator.Clear();
MainThreadOnly().timer_task_cost_estimator.Clear();
- MainThreadOnly().short_idle_period_duration.Clear();
- // Make sure that we don't initially assume there is no idle time.
- MainThreadOnly().short_idle_period_duration.InsertSample(
- cc::BeginFrameArgs::DefaultInterval());
+ MainThreadOnly().idle_time_estimator.Clear();
AnyThread().user_model.Reset();
MainThreadOnly().have_seen_a_begin_main_frame = false;
UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED);

Powered by Google App Engine
This is Rietveld 408576698