Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/scheduler/renderer/renderer_scheduler_impl.h" | 5 #include "platform/scheduler/renderer/renderer_scheduler_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/debug/stack_trace.h" | 8 #include "base/debug/stack_trace.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 29 // the cost of loading tasks. | 29 // the cost of loading tasks. |
| 30 const int kLoadingTaskEstimationSampleCount = 1000; | 30 const int kLoadingTaskEstimationSampleCount = 1000; |
| 31 const double kLoadingTaskEstimationPercentile = 99; | 31 const double kLoadingTaskEstimationPercentile = 99; |
| 32 const int kTimerTaskEstimationSampleCount = 1000; | 32 const int kTimerTaskEstimationSampleCount = 1000; |
| 33 const double kTimerTaskEstimationPercentile = 99; | 33 const double kTimerTaskEstimationPercentile = 99; |
| 34 const int kShortIdlePeriodDurationSampleCount = 10; | 34 const int kShortIdlePeriodDurationSampleCount = 10; |
| 35 const double kShortIdlePeriodDurationPercentile = 50; | 35 const double kShortIdlePeriodDurationPercentile = 50; |
| 36 // Amount of idle time left in a frame (as a ratio of the vsync interval) above | 36 // Amount of idle time left in a frame (as a ratio of the vsync interval) above |
| 37 // which main thread compositing can be considered fast. | 37 // which main thread compositing can be considered fast. |
| 38 const double kFastCompositingIdleTimeThreshold = .2; | 38 const double kFastCompositingIdleTimeThreshold = .2; |
| 39 | |
| 40 void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) { | |
| 41 UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.ForegroundRendererLoad", | |
| 42 static_cast<int>(load * 100)); | |
| 43 } | |
| 44 | |
| 45 void ReportBackgroundRendererTaskLoad(base::TimeTicks time, double load) { | |
| 46 UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.BackgroundRendererLoad", | |
| 47 static_cast<int>(load * 100)); | |
| 48 } | |
| 49 | |
| 39 } // namespace | 50 } // namespace |
| 40 | 51 |
| 41 RendererSchedulerImpl::RendererSchedulerImpl( | 52 RendererSchedulerImpl::RendererSchedulerImpl( |
| 42 scoped_refptr<SchedulerTqmDelegate> main_task_runner) | 53 scoped_refptr<SchedulerTqmDelegate> main_task_runner) |
| 43 : helper_(main_task_runner, | 54 : helper_(main_task_runner, |
| 44 "renderer.scheduler", | 55 "renderer.scheduler", |
| 45 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 56 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
| 46 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler.debug")), | 57 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler.debug")), |
| 47 idle_helper_(&helper_, | 58 idle_helper_(&helper_, |
| 48 this, | 59 this, |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 116 kLoadingTaskEstimationPercentile), | 127 kLoadingTaskEstimationPercentile), |
| 117 timer_task_cost_estimator(time_source, | 128 timer_task_cost_estimator(time_source, |
| 118 kTimerTaskEstimationSampleCount, | 129 kTimerTaskEstimationSampleCount, |
| 119 kTimerTaskEstimationPercentile), | 130 kTimerTaskEstimationPercentile), |
| 120 queueing_time_estimator(renderer_scheduler_impl, | 131 queueing_time_estimator(renderer_scheduler_impl, |
| 121 base::TimeDelta::FromSeconds(1)), | 132 base::TimeDelta::FromSeconds(1)), |
| 122 idle_time_estimator(compositor_task_runner, | 133 idle_time_estimator(compositor_task_runner, |
| 123 time_source, | 134 time_source, |
| 124 kShortIdlePeriodDurationSampleCount, | 135 kShortIdlePeriodDurationSampleCount, |
| 125 kShortIdlePeriodDurationPercentile), | 136 kShortIdlePeriodDurationPercentile), |
| 137 background_renderer_load_tracker( | |
| 138 time_source->NowTicks(), | |
|
Sami
2016/08/22 14:33:16
It'd be nice to pass in the same starting time to
altimin
2016/08/22 15:36:24
Done.
| |
| 139 base::Bind(&ReportBackgroundRendererTaskLoad)), | |
| 140 foreground_renderer_load_tracker( | |
| 141 time_source->NowTicks(), | |
| 142 base::Bind(&ReportForegroundRendererTaskLoad)), | |
| 126 current_use_case(UseCase::NONE), | 143 current_use_case(UseCase::NONE), |
| 127 timer_queue_suspend_count(0), | 144 timer_queue_suspend_count(0), |
| 128 navigation_task_expected_count(0), | 145 navigation_task_expected_count(0), |
| 129 expensive_task_policy(ExpensiveTaskPolicy::RUN), | 146 expensive_task_policy(ExpensiveTaskPolicy::RUN), |
| 130 renderer_hidden(false), | 147 renderer_hidden(false), |
| 131 renderer_backgrounded(false), | 148 renderer_backgrounded(false), |
| 132 renderer_suspended(false), | 149 renderer_suspended(false), |
| 133 timer_queue_suspension_when_backgrounded_enabled(false), | 150 timer_queue_suspension_when_backgrounded_enabled(false), |
| 134 timer_queue_suspended_when_backgrounded(false), | 151 timer_queue_suspended_when_backgrounded(false), |
| 135 was_shutdown(false), | 152 was_shutdown(false), |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 156 have_seen_touchstart(false) {} | 173 have_seen_touchstart(false) {} |
| 157 | 174 |
| 158 RendererSchedulerImpl::AnyThread::~AnyThread() {} | 175 RendererSchedulerImpl::AnyThread::~AnyThread() {} |
| 159 | 176 |
| 160 RendererSchedulerImpl::CompositorThreadOnly::CompositorThreadOnly() | 177 RendererSchedulerImpl::CompositorThreadOnly::CompositorThreadOnly() |
| 161 : last_input_type(blink::WebInputEvent::Undefined) {} | 178 : last_input_type(blink::WebInputEvent::Undefined) {} |
| 162 | 179 |
| 163 RendererSchedulerImpl::CompositorThreadOnly::~CompositorThreadOnly() {} | 180 RendererSchedulerImpl::CompositorThreadOnly::~CompositorThreadOnly() {} |
| 164 | 181 |
| 165 void RendererSchedulerImpl::Shutdown() { | 182 void RendererSchedulerImpl::Shutdown() { |
| 183 base::TimeTicks now = tick_clock()->NowTicks(); | |
| 184 MainThreadOnly().background_renderer_load_tracker.RecordIdle(now); | |
| 185 MainThreadOnly().foreground_renderer_load_tracker.RecordIdle(now); | |
| 186 | |
| 166 throttling_helper_.reset(); | 187 throttling_helper_.reset(); |
| 167 helper_.Shutdown(); | 188 helper_.Shutdown(); |
| 168 MainThreadOnly().was_shutdown = true; | 189 MainThreadOnly().was_shutdown = true; |
| 169 MainThreadOnly().rail_mode_observer = nullptr; | 190 MainThreadOnly().rail_mode_observer = nullptr; |
| 170 } | 191 } |
| 171 | 192 |
| 172 std::unique_ptr<blink::WebThread> RendererSchedulerImpl::CreateMainThread() { | 193 std::unique_ptr<blink::WebThread> RendererSchedulerImpl::CreateMainThread() { |
| 173 return base::MakeUnique<WebThreadImplForRendererScheduler>(this); | 194 return base::MakeUnique<WebThreadImplForRendererScheduler>(this); |
| 174 } | 195 } |
| 175 | 196 |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 398 } | 419 } |
| 399 | 420 |
| 400 void RendererSchedulerImpl::OnRendererBackgrounded() { | 421 void RendererSchedulerImpl::OnRendererBackgrounded() { |
| 401 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 422 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
| 402 "RendererSchedulerImpl::OnRendererBackgrounded"); | 423 "RendererSchedulerImpl::OnRendererBackgrounded"); |
| 403 helper_.CheckOnValidThread(); | 424 helper_.CheckOnValidThread(); |
| 404 if (helper_.IsShutdown() || MainThreadOnly().renderer_backgrounded) | 425 if (helper_.IsShutdown() || MainThreadOnly().renderer_backgrounded) |
| 405 return; | 426 return; |
| 406 | 427 |
| 407 MainThreadOnly().renderer_backgrounded = true; | 428 MainThreadOnly().renderer_backgrounded = true; |
| 429 | |
| 430 base::TimeTicks now = tick_clock()->NowTicks(); | |
| 431 MainThreadOnly().foreground_renderer_load_tracker.Pause(now); | |
| 432 MainThreadOnly().background_renderer_load_tracker.Resume(now); | |
| 433 | |
| 408 if (!MainThreadOnly().timer_queue_suspension_when_backgrounded_enabled) | 434 if (!MainThreadOnly().timer_queue_suspension_when_backgrounded_enabled) |
| 409 return; | 435 return; |
| 410 | 436 |
| 411 suspend_timers_when_backgrounded_closure_.Cancel(); | 437 suspend_timers_when_backgrounded_closure_.Cancel(); |
| 412 base::TimeDelta suspend_timers_when_backgrounded_delay = | 438 base::TimeDelta suspend_timers_when_backgrounded_delay = |
| 413 base::TimeDelta::FromMilliseconds( | 439 base::TimeDelta::FromMilliseconds( |
| 414 kSuspendTimersWhenBackgroundedDelayMillis); | 440 kSuspendTimersWhenBackgroundedDelayMillis); |
| 415 control_task_runner_->PostDelayedTask( | 441 control_task_runner_->PostDelayedTask( |
| 416 FROM_HERE, suspend_timers_when_backgrounded_closure_.callback(), | 442 FROM_HERE, suspend_timers_when_backgrounded_closure_.callback(), |
| 417 suspend_timers_when_backgrounded_delay); | 443 suspend_timers_when_backgrounded_delay); |
| 418 } | 444 } |
| 419 | 445 |
| 420 void RendererSchedulerImpl::OnRendererForegrounded() { | 446 void RendererSchedulerImpl::OnRendererForegrounded() { |
| 421 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 447 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
| 422 "RendererSchedulerImpl::OnRendererForegrounded"); | 448 "RendererSchedulerImpl::OnRendererForegrounded"); |
| 423 helper_.CheckOnValidThread(); | 449 helper_.CheckOnValidThread(); |
| 424 if (helper_.IsShutdown() || !MainThreadOnly().renderer_backgrounded) | 450 if (helper_.IsShutdown() || !MainThreadOnly().renderer_backgrounded) |
| 425 return; | 451 return; |
| 426 | 452 |
| 427 MainThreadOnly().renderer_backgrounded = false; | 453 MainThreadOnly().renderer_backgrounded = false; |
| 428 MainThreadOnly().renderer_suspended = false; | 454 MainThreadOnly().renderer_suspended = false; |
| 455 | |
| 456 base::TimeTicks now = tick_clock()->NowTicks(); | |
| 457 MainThreadOnly().foreground_renderer_load_tracker.Resume(now); | |
| 458 MainThreadOnly().background_renderer_load_tracker.Pause(now); | |
| 459 | |
| 429 suspend_timers_when_backgrounded_closure_.Cancel(); | 460 suspend_timers_when_backgrounded_closure_.Cancel(); |
| 430 ResumeTimerQueueWhenForegrounded(); | 461 ResumeTimerQueueWhenForegrounded(); |
| 431 } | 462 } |
| 432 | 463 |
| 433 void RendererSchedulerImpl::SuspendRenderer() { | 464 void RendererSchedulerImpl::SuspendRenderer() { |
| 434 helper_.CheckOnValidThread(); | 465 helper_.CheckOnValidThread(); |
| 435 DCHECK(MainThreadOnly().renderer_backgrounded); | 466 DCHECK(MainThreadOnly().renderer_backgrounded); |
| 436 if (helper_.IsShutdown()) | 467 if (helper_.IsShutdown()) |
| 437 return; | 468 return; |
| 438 suspend_timers_when_backgrounded_closure_.Cancel(); | 469 suspend_timers_when_backgrounded_closure_.Cancel(); |
| (...skipping 967 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1406 " and https://crbug.com/574343#c40 for more information."); | 1437 " and https://crbug.com/574343#c40 for more information."); |
| 1407 } | 1438 } |
| 1408 } | 1439 } |
| 1409 | 1440 |
| 1410 void RendererSchedulerImpl::ReportTaskTime(base::TimeTicks start_time, | 1441 void RendererSchedulerImpl::ReportTaskTime(base::TimeTicks start_time, |
| 1411 base::TimeTicks end_time) { | 1442 base::TimeTicks end_time) { |
| 1412 MainThreadOnly().queueing_time_estimator.OnToplevelTaskCompleted(start_time, | 1443 MainThreadOnly().queueing_time_estimator.OnToplevelTaskCompleted(start_time, |
| 1413 end_time); | 1444 end_time); |
| 1414 MainThreadOnly().long_task_tracker.RecordLongTask( | 1445 MainThreadOnly().long_task_tracker.RecordLongTask( |
| 1415 start_time, end_time - start_time); | 1446 start_time, end_time - start_time); |
| 1447 MainThreadOnly().foreground_renderer_load_tracker.RecordTaskTime(start_time, | |
|
Sami
2016/08/22 14:33:16
Could we only do this for the one active one?
altimin
2016/08/22 15:36:24
Started to bail out early from ThreadLoadTracker::
| |
| 1448 end_time); | |
| 1449 MainThreadOnly().background_renderer_load_tracker.RecordTaskTime(start_time, | |
| 1450 end_time); | |
|
Sami
2016/08/22 14:33:16
Maybe add a comment saying we'd really want to use
altimin
2016/08/22 15:36:24
Done.
| |
| 1416 UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime", | 1451 UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime", |
| 1417 (end_time - start_time).InMicroseconds(), 1, | 1452 (end_time - start_time).InMicroseconds(), 1, |
| 1418 1000000, 50); | 1453 1000000, 50); |
| 1419 } | 1454 } |
| 1420 | 1455 |
| 1421 LongTaskTracker::LongTaskTiming RendererSchedulerImpl::GetLongTaskTiming() { | 1456 LongTaskTracker::LongTaskTiming RendererSchedulerImpl::GetLongTaskTiming() { |
| 1422 return MainThreadOnly().long_task_tracker.GetLongTaskTiming(); | 1457 return MainThreadOnly().long_task_tracker.GetLongTaskTiming(); |
| 1423 } | 1458 } |
| 1424 | 1459 |
| 1425 void RendererSchedulerImpl::OnQueueingTimeForWindowEstimated( | 1460 void RendererSchedulerImpl::OnQueueingTimeForWindowEstimated( |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1488 case v8::PERFORMANCE_LOAD: | 1523 case v8::PERFORMANCE_LOAD: |
| 1489 return "load"; | 1524 return "load"; |
| 1490 default: | 1525 default: |
| 1491 NOTREACHED(); | 1526 NOTREACHED(); |
| 1492 return nullptr; | 1527 return nullptr; |
| 1493 } | 1528 } |
| 1494 } | 1529 } |
| 1495 | 1530 |
| 1496 } // namespace scheduler | 1531 } // namespace scheduler |
| 1497 } // namespace blink | 1532 } // namespace blink |
| OLD | NEW |