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

Side by Side Diff: components/scheduler/renderer/renderer_scheduler_impl.cc

Issue 1898233002: Report expected task queueing time via UMA (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Super rough alternative approach. Created 4 years, 6 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 unified diff | Download patch
OLDNEW
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 "components/scheduler/renderer/renderer_scheduler_impl.h" 5 #include "components/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"
11 #include "base/message_loop/message_loop.h"
12 #include "base/metrics/histogram_macros.h"
11 #include "base/trace_event/trace_event.h" 13 #include "base/trace_event/trace_event.h"
12 #include "base/trace_event/trace_event_argument.h" 14 #include "base/trace_event/trace_event_argument.h"
13 #include "cc/output/begin_frame_args.h" 15 #include "cc/output/begin_frame_args.h"
14 #include "components/scheduler/base/task_queue_impl.h" 16 #include "components/scheduler/base/task_queue_impl.h"
15 #include "components/scheduler/base/task_queue_selector.h" 17 #include "components/scheduler/base/task_queue_selector.h"
16 #include "components/scheduler/base/virtual_time_domain.h" 18 #include "components/scheduler/base/virtual_time_domain.h"
17 #include "components/scheduler/child/scheduler_tqm_delegate.h" 19 #include "components/scheduler/child/scheduler_tqm_delegate.h"
18 #include "components/scheduler/renderer/web_view_scheduler_impl.h" 20 #include "components/scheduler/renderer/web_view_scheduler_impl.h"
19 #include "components/scheduler/renderer/webthread_impl_for_renderer_scheduler.h" 21 #include "components/scheduler/renderer/webthread_impl_for_renderer_scheduler.h"
20 22
(...skipping 28 matching lines...) Expand all
49 base::TimeDelta()), 51 base::TimeDelta()),
50 render_widget_scheduler_signals_(this), 52 render_widget_scheduler_signals_(this),
51 control_task_runner_(helper_.ControlTaskRunner()), 53 control_task_runner_(helper_.ControlTaskRunner()),
52 compositor_task_runner_( 54 compositor_task_runner_(
53 helper_.NewTaskQueue(TaskQueue::Spec("compositor_tq") 55 helper_.NewTaskQueue(TaskQueue::Spec("compositor_tq")
54 .SetShouldMonitorQuiescence(true))), 56 .SetShouldMonitorQuiescence(true))),
55 delayed_update_policy_runner_( 57 delayed_update_policy_runner_(
56 base::Bind(&RendererSchedulerImpl::UpdatePolicy, 58 base::Bind(&RendererSchedulerImpl::UpdatePolicy,
57 base::Unretained(this)), 59 base::Unretained(this)),
58 helper_.ControlTaskRunner()), 60 helper_.ControlTaskRunner()),
59 main_thread_only_(compositor_task_runner_, 61 main_thread_only_(this,
62 compositor_task_runner_,
60 helper_.scheduler_tqm_delegate().get()), 63 helper_.scheduler_tqm_delegate().get()),
64 coarse_duration_timer_observing_(false),
61 policy_may_need_update_(&any_thread_lock_), 65 policy_may_need_update_(&any_thread_lock_),
62 weak_factory_(this) { 66 weak_factory_(this) {
63 throttling_helper_.reset(new ThrottlingHelper(this, "renderer.scheduler")); 67 throttling_helper_.reset(new ThrottlingHelper(this, "renderer.scheduler"));
64 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, 68 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy,
65 weak_factory_.GetWeakPtr()); 69 weak_factory_.GetWeakPtr());
66 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( 70 end_renderer_hidden_idle_period_closure_.Reset(base::Bind(
67 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); 71 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr()));
68 72
69 suspend_timers_when_backgrounded_closure_.Reset( 73 suspend_timers_when_backgrounded_closure_.Reset(
70 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, 74 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded,
71 weak_factory_.GetWeakPtr())); 75 weak_factory_.GetWeakPtr()));
72 76
73 default_loading_task_runner_ = NewLoadingTaskRunner("default_loading_tq"); 77 default_loading_task_runner_ = NewLoadingTaskRunner("default_loading_tq");
74 default_timer_task_runner_ = NewTimerTaskRunner("default_timer_tq"); 78 default_timer_task_runner_ = NewTimerTaskRunner("default_timer_tq");
75 79
76 TRACE_EVENT_OBJECT_CREATED_WITH_ID( 80 TRACE_EVENT_OBJECT_CREATED_WITH_ID(
77 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", 81 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler",
78 this); 82 this);
79 83
80 helper_.SetObserver(this); 84 helper_.SetObserver(this);
85 AddTaskObserver(&MainThreadOnly().queueing_time_estimator);
81 } 86 }
82 87
83 RendererSchedulerImpl::~RendererSchedulerImpl() { 88 RendererSchedulerImpl::~RendererSchedulerImpl() {
84 TRACE_EVENT_OBJECT_DELETED_WITH_ID( 89 TRACE_EVENT_OBJECT_DELETED_WITH_ID(
85 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", 90 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler",
86 this); 91 this);
87 92
88 for (const scoped_refptr<TaskQueue>& loading_queue : loading_task_runners_) { 93 for (const scoped_refptr<TaskQueue>& loading_queue : loading_task_runners_) {
89 loading_queue->RemoveTaskObserver( 94 loading_queue->RemoveTaskObserver(
90 &MainThreadOnly().loading_task_cost_estimator); 95 &MainThreadOnly().loading_task_cost_estimator);
91 } 96 }
92 for (const scoped_refptr<TaskQueue>& timer_queue : timer_task_runners_) { 97 for (const scoped_refptr<TaskQueue>& timer_queue : timer_task_runners_) {
93 timer_queue->RemoveTaskObserver( 98 timer_queue->RemoveTaskObserver(
94 &MainThreadOnly().timer_task_cost_estimator); 99 &MainThreadOnly().timer_task_cost_estimator);
95 } 100 }
101 RemoveTaskObserver(&MainThreadOnly().queueing_time_estimator);
96 102
97 // Ensure the renderer scheduler was shut down explicitly, because otherwise 103 // Ensure the renderer scheduler was shut down explicitly, because otherwise
98 // we could end up having stale pointers to the Blink heap which has been 104 // we could end up having stale pointers to the Blink heap which has been
99 // terminated by this point. 105 // terminated by this point.
100 DCHECK(MainThreadOnly().was_shutdown); 106 DCHECK(MainThreadOnly().was_shutdown);
101 } 107 }
102 108
103 RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( 109 RendererSchedulerImpl::MainThreadOnly::MainThreadOnly(
110 RendererSchedulerImpl* renderer_scheduler_impl,
104 const scoped_refptr<TaskQueue>& compositor_task_runner, 111 const scoped_refptr<TaskQueue>& compositor_task_runner,
105 base::TickClock* time_source) 112 base::TickClock* time_source)
106 : loading_task_cost_estimator(time_source, 113 : loading_task_cost_estimator(time_source,
107 kLoadingTaskEstimationSampleCount, 114 kLoadingTaskEstimationSampleCount,
108 kLoadingTaskEstimationPercentile), 115 kLoadingTaskEstimationPercentile),
109 timer_task_cost_estimator(time_source, 116 timer_task_cost_estimator(time_source,
110 kTimerTaskEstimationSampleCount, 117 kTimerTaskEstimationSampleCount,
111 kTimerTaskEstimationPercentile), 118 kTimerTaskEstimationPercentile),
112 idle_time_estimator(compositor_task_runner, 119 idle_time_estimator(compositor_task_runner,
113 time_source, 120 time_source,
114 kShortIdlePeriodDurationSampleCount, 121 kShortIdlePeriodDurationSampleCount,
115 kShortIdlePeriodDurationPercentile), 122 kShortIdlePeriodDurationPercentile),
123 queueing_time_estimator(renderer_scheduler_impl,
124 renderer_scheduler_impl->coarse_duration_timer(),
125 base::TimeDelta::FromSeconds(5)),
116 current_use_case(UseCase::NONE), 126 current_use_case(UseCase::NONE),
117 timer_queue_suspend_count(0), 127 timer_queue_suspend_count(0),
118 navigation_task_expected_count(0), 128 navigation_task_expected_count(0),
119 expensive_task_policy(ExpensiveTaskPolicy::RUN), 129 expensive_task_policy(ExpensiveTaskPolicy::RUN),
120 renderer_hidden(false), 130 renderer_hidden(false),
121 renderer_backgrounded(false), 131 renderer_backgrounded(false),
122 timer_queue_suspension_when_backgrounded_enabled(false), 132 timer_queue_suspension_when_backgrounded_enabled(false),
123 timer_queue_suspended_when_backgrounded(false), 133 timer_queue_suspended_when_backgrounded(false),
124 was_shutdown(false), 134 was_shutdown(false),
125 loading_tasks_seem_expensive(false), 135 loading_tasks_seem_expensive(false),
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 if (blink::WebInputEvent::isMouseEventType(web_input_event.type) || 447 if (blink::WebInputEvent::isMouseEventType(web_input_event.type) ||
438 blink::WebInputEvent::isKeyboardEventType(web_input_event.type)) { 448 blink::WebInputEvent::isKeyboardEventType(web_input_event.type)) {
439 return false; 449 return false;
440 } 450 }
441 return true; 451 return true;
442 } 452 }
443 453
444 void RendererSchedulerImpl::DidHandleInputEventOnCompositorThread( 454 void RendererSchedulerImpl::DidHandleInputEventOnCompositorThread(
445 const blink::WebInputEvent& web_input_event, 455 const blink::WebInputEvent& web_input_event,
446 InputEventState event_state) { 456 InputEventState event_state) {
457
458 // TODO - move this.
459 if (coarse_duration_timer_observing_ == false) {
460 coarse_duration_timer_observing_ = true;
461 base::MessageLoop::current()->AddRecentTimeObserver(
462 &coarse_duration_timer_);
463 }
tdresser 2016/05/30 19:07:46 ^
464
447 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 465 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
448 "RendererSchedulerImpl::DidHandleInputEventOnCompositorThread"); 466 "RendererSchedulerImpl::DidHandleInputEventOnCompositorThread");
449 if (!ShouldPrioritizeInputEvent(web_input_event)) 467 if (!ShouldPrioritizeInputEvent(web_input_event))
450 return; 468 return;
451 469
452 UpdateForInputEventOnCompositorThread(web_input_event.type, event_state); 470 UpdateForInputEventOnCompositorThread(web_input_event.type, event_state);
453 } 471 }
454 472
455 void RendererSchedulerImpl::DidAnimateForInputOnCompositorThread() { 473 void RendererSchedulerImpl::DidAnimateForInputOnCompositorThread() {
456 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 474 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
(...skipping 866 matching lines...) Expand 10 before | Expand all | Expand 10 after
1323 true; 1341 true;
1324 BroadcastConsoleWarning( 1342 BroadcastConsoleWarning(
1325 "Blink deferred a task in order to make scrolling smoother. " 1343 "Blink deferred a task in order to make scrolling smoother. "
1326 "Your timer and network tasks should take less than 50ms to run " 1344 "Your timer and network tasks should take less than 50ms to run "
1327 "to avoid this. Please see " 1345 "to avoid this. Please see "
1328 "https://developers.google.com/web/tools/chrome-devtools/profile/evaluat e-performance/rail" 1346 "https://developers.google.com/web/tools/chrome-devtools/profile/evaluat e-performance/rail"
1329 " and https://crbug.com/574343#c40 for more information."); 1347 " and https://crbug.com/574343#c40 for more information.");
1330 } 1348 }
1331 } 1349 }
1332 1350
1351 void RendererSchedulerImpl::OnQueueingTimeForWindowEstimated(
1352 base::TimeDelta queueing_time) {
1353 // TODO - UMA_HISTOGRAM_TIMES is probably wrong.
1354 UMA_HISTOGRAM_TIMES("RendererScheduler.ExpectedTaskQueueingDuration",
1355 queueing_time);
1356 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
1357 "estimated_queueing_time_for_window",
1358 queueing_time.InMillisecondsF());
1359 }
1360
1333 } // namespace scheduler 1361 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698