| Index: third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
|
| diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
|
| index 9c5e33a261fef355db3ff3399cc626aa9141ce70..b378e8d7d3671a4f13a8e714e30a02933acea815 100644
|
| --- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
|
| +++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
|
| @@ -36,6 +36,21 @@ const double kShortIdlePeriodDurationPercentile = 50;
|
| // Amount of idle time left in a frame (as a ratio of the vsync interval) above
|
| // which main thread compositing can be considered fast.
|
| const double kFastCompositingIdleTimeThreshold = .2;
|
| +
|
| +void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) {
|
| + UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.ForegroundRendererMainThreadLoad",
|
| + static_cast<int>(load * 100));
|
| + TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
|
| + "RendererScheduler.ForegroundRendererLoad", load);
|
| +}
|
| +
|
| +void ReportBackgroundRendererTaskLoad(base::TimeTicks time, double load) {
|
| + UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.BackgroundRendererMainThreadLoad",
|
| + static_cast<int>(load * 100));
|
| + TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
|
| + "RendererScheduler.BackgroundRendererLoad", load);
|
| +}
|
| +
|
| } // namespace
|
|
|
| RendererSchedulerImpl::RendererSchedulerImpl(
|
| @@ -60,7 +75,8 @@ RendererSchedulerImpl::RendererSchedulerImpl(
|
| helper_.ControlTaskRunner()),
|
| main_thread_only_(this,
|
| compositor_task_runner_,
|
| - helper_.scheduler_tqm_delegate().get()),
|
| + helper_.scheduler_tqm_delegate().get(),
|
| + helper_.scheduler_tqm_delegate()->NowTicks()),
|
| policy_may_need_update_(&any_thread_lock_),
|
| weak_factory_(this) {
|
| throttling_helper_.reset(new ThrottlingHelper(this, "renderer.scheduler"));
|
| @@ -110,7 +126,8 @@ RendererSchedulerImpl::~RendererSchedulerImpl() {
|
| RendererSchedulerImpl::MainThreadOnly::MainThreadOnly(
|
| RendererSchedulerImpl* renderer_scheduler_impl,
|
| const scoped_refptr<TaskQueue>& compositor_task_runner,
|
| - base::TickClock* time_source)
|
| + base::TickClock* time_source,
|
| + base::TimeTicks now)
|
| : loading_task_cost_estimator(time_source,
|
| kLoadingTaskEstimationSampleCount,
|
| kLoadingTaskEstimationPercentile),
|
| @@ -123,6 +140,12 @@ RendererSchedulerImpl::MainThreadOnly::MainThreadOnly(
|
| time_source,
|
| kShortIdlePeriodDurationSampleCount,
|
| kShortIdlePeriodDurationPercentile),
|
| + background_main_thread_load_tracker(
|
| + now,
|
| + base::Bind(&ReportBackgroundRendererTaskLoad)),
|
| + foreground_main_thread_load_tracker(
|
| + now,
|
| + base::Bind(&ReportForegroundRendererTaskLoad)),
|
| current_use_case(UseCase::NONE),
|
| timer_queue_suspend_count(0),
|
| navigation_task_expected_count(0),
|
| @@ -163,6 +186,10 @@ RendererSchedulerImpl::CompositorThreadOnly::CompositorThreadOnly()
|
| RendererSchedulerImpl::CompositorThreadOnly::~CompositorThreadOnly() {}
|
|
|
| void RendererSchedulerImpl::Shutdown() {
|
| + base::TimeTicks now = tick_clock()->NowTicks();
|
| + MainThreadOnly().background_main_thread_load_tracker.RecordIdle(now);
|
| + MainThreadOnly().foreground_main_thread_load_tracker.RecordIdle(now);
|
| +
|
| throttling_helper_.reset();
|
| helper_.Shutdown();
|
| MainThreadOnly().was_shutdown = true;
|
| @@ -405,6 +432,11 @@ void RendererSchedulerImpl::OnRendererBackgrounded() {
|
| return;
|
|
|
| MainThreadOnly().renderer_backgrounded = true;
|
| +
|
| + base::TimeTicks now = tick_clock()->NowTicks();
|
| + MainThreadOnly().foreground_main_thread_load_tracker.Pause(now);
|
| + MainThreadOnly().background_main_thread_load_tracker.Resume(now);
|
| +
|
| if (!MainThreadOnly().timer_queue_suspension_when_backgrounded_enabled)
|
| return;
|
|
|
| @@ -426,6 +458,11 @@ void RendererSchedulerImpl::OnRendererForegrounded() {
|
|
|
| MainThreadOnly().renderer_backgrounded = false;
|
| MainThreadOnly().renderer_suspended = false;
|
| +
|
| + base::TimeTicks now = tick_clock()->NowTicks();
|
| + MainThreadOnly().foreground_main_thread_load_tracker.Resume(now);
|
| + MainThreadOnly().background_main_thread_load_tracker.Pause(now);
|
| +
|
| suspend_timers_when_backgrounded_closure_.Cancel();
|
| ResumeTimerQueueWhenForegrounded();
|
| }
|
| @@ -1413,6 +1450,13 @@ void RendererSchedulerImpl::ReportTaskTime(base::TimeTicks start_time,
|
| end_time);
|
| MainThreadOnly().long_task_tracker.RecordLongTask(
|
| start_time, end_time - start_time);
|
| + // We want to measure thread time here, but for efficiency reasons
|
| + // we stick with wall time.
|
| + MainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime(
|
| + start_time, end_time);
|
| + MainThreadOnly().background_main_thread_load_tracker.RecordTaskTime(
|
| + start_time, end_time);
|
| + // TODO(altimin): Per-page metrics should also be considered.
|
| UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime",
|
| (end_time - start_time).InMicroseconds(), 1,
|
| 1000000, 50);
|
|
|