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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 "RendererScheduler.ForegroundRendererLoad", load); | 44 "RendererScheduler.ForegroundRendererLoad", load); |
45 } | 45 } |
46 | 46 |
47 void ReportBackgroundRendererTaskLoad(base::TimeTicks time, double load) { | 47 void ReportBackgroundRendererTaskLoad(base::TimeTicks time, double load) { |
48 UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.BackgroundRendererMainThreadLoad", | 48 UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.BackgroundRendererMainThreadLoad", |
49 static_cast<int>(load * 100)); | 49 static_cast<int>(load * 100)); |
50 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 50 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
51 "RendererScheduler.BackgroundRendererLoad", load); | 51 "RendererScheduler.BackgroundRendererLoad", load); |
52 } | 52 } |
53 | 53 |
| 54 base::TimeTicks MonotonicTimeInSecondsToTimeTicks( |
| 55 double monotonicTimeInSeconds) { |
| 56 return base::TimeTicks() + base::TimeDelta::FromSecondsD( |
| 57 monotonicTimeInSeconds); |
| 58 } |
54 } // namespace | 59 } // namespace |
55 | 60 |
56 RendererSchedulerImpl::RendererSchedulerImpl( | 61 RendererSchedulerImpl::RendererSchedulerImpl( |
57 scoped_refptr<SchedulerTqmDelegate> main_task_runner) | 62 scoped_refptr<SchedulerTqmDelegate> main_task_runner) |
58 : helper_(main_task_runner, | 63 : helper_(main_task_runner, |
59 "renderer.scheduler", | 64 "renderer.scheduler", |
60 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 65 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
61 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler.debug")), | 66 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler.debug")), |
62 idle_helper_(&helper_, | 67 idle_helper_(&helper_, |
63 this, | 68 this, |
(...skipping 26 matching lines...) Expand all Loading... |
90 weak_factory_.GetWeakPtr())); | 95 weak_factory_.GetWeakPtr())); |
91 | 96 |
92 default_loading_task_runner_ = NewLoadingTaskRunner("default_loading_tq"); | 97 default_loading_task_runner_ = NewLoadingTaskRunner("default_loading_tq"); |
93 default_timer_task_runner_ = NewTimerTaskRunner("default_timer_tq"); | 98 default_timer_task_runner_ = NewTimerTaskRunner("default_timer_tq"); |
94 | 99 |
95 TRACE_EVENT_OBJECT_CREATED_WITH_ID( | 100 TRACE_EVENT_OBJECT_CREATED_WITH_ID( |
96 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", | 101 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", |
97 this); | 102 this); |
98 | 103 |
99 helper_.SetObserver(this); | 104 helper_.SetObserver(this); |
100 helper_.SetTaskTimeTracker(this); | 105 helper_.AddTaskTimeObserver(this); |
101 } | 106 } |
102 | 107 |
103 RendererSchedulerImpl::~RendererSchedulerImpl() { | 108 RendererSchedulerImpl::~RendererSchedulerImpl() { |
104 TRACE_EVENT_OBJECT_DELETED_WITH_ID( | 109 TRACE_EVENT_OBJECT_DELETED_WITH_ID( |
105 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", | 110 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", |
106 this); | 111 this); |
107 | 112 |
108 for (const scoped_refptr<TaskQueue>& loading_queue : loading_task_runners_) { | 113 for (const scoped_refptr<TaskQueue>& loading_queue : loading_task_runners_) { |
109 loading_queue->RemoveTaskObserver( | 114 loading_queue->RemoveTaskObserver( |
110 &MainThreadOnly().loading_task_cost_estimator); | 115 &MainThreadOnly().loading_task_cost_estimator); |
111 } | 116 } |
112 for (const scoped_refptr<TaskQueue>& timer_queue : timer_task_runners_) { | 117 for (const scoped_refptr<TaskQueue>& timer_queue : timer_task_runners_) { |
113 timer_queue->RemoveTaskObserver( | 118 timer_queue->RemoveTaskObserver( |
114 &MainThreadOnly().timer_task_cost_estimator); | 119 &MainThreadOnly().timer_task_cost_estimator); |
115 } | 120 } |
116 | 121 |
117 if (virtual_time_domain_) | 122 if (virtual_time_domain_) |
118 UnregisterTimeDomain(virtual_time_domain_.get()); | 123 UnregisterTimeDomain(virtual_time_domain_.get()); |
119 | 124 |
| 125 helper_.RemoveTaskTimeObserver(this); |
| 126 |
120 // Ensure the renderer scheduler was shut down explicitly, because otherwise | 127 // Ensure the renderer scheduler was shut down explicitly, because otherwise |
121 // we could end up having stale pointers to the Blink heap which has been | 128 // we could end up having stale pointers to the Blink heap which has been |
122 // terminated by this point. | 129 // terminated by this point. |
123 DCHECK(MainThreadOnly().was_shutdown); | 130 DCHECK(MainThreadOnly().was_shutdown); |
124 } | 131 } |
125 | 132 |
126 RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( | 133 RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( |
127 RendererSchedulerImpl* renderer_scheduler_impl, | 134 RendererSchedulerImpl* renderer_scheduler_impl, |
128 const scoped_refptr<TaskQueue>& compositor_task_runner, | 135 const scoped_refptr<TaskQueue>& compositor_task_runner, |
129 base::TickClock* time_source, | 136 base::TickClock* time_source, |
(...skipping 1315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1445 true; | 1452 true; |
1446 BroadcastIntervention( | 1453 BroadcastIntervention( |
1447 "Blink deferred a task in order to make scrolling smoother. " | 1454 "Blink deferred a task in order to make scrolling smoother. " |
1448 "Your timer and network tasks should take less than 50ms to run " | 1455 "Your timer and network tasks should take less than 50ms to run " |
1449 "to avoid this. Please see " | 1456 "to avoid this. Please see " |
1450 "https://developers.google.com/web/tools/chrome-devtools/profile/evaluat
e-performance/rail" | 1457 "https://developers.google.com/web/tools/chrome-devtools/profile/evaluat
e-performance/rail" |
1451 " and https://crbug.com/574343#c40 for more information."); | 1458 " and https://crbug.com/574343#c40 for more information."); |
1452 } | 1459 } |
1453 } | 1460 } |
1454 | 1461 |
1455 void RendererSchedulerImpl::ReportTaskTime(base::TimeTicks start_time, | 1462 void RendererSchedulerImpl::ReportTaskTime(double start_time, double end_time) { |
1456 base::TimeTicks end_time) { | 1463 base::TimeTicks start_time_ticks = |
1457 MainThreadOnly().queueing_time_estimator.OnToplevelTaskCompleted(start_time, | 1464 MonotonicTimeInSecondsToTimeTicks(start_time); |
1458 end_time); | 1465 base::TimeTicks end_time_ticks = MonotonicTimeInSecondsToTimeTicks(end_time); |
1459 MainThreadOnly().long_task_tracker.RecordLongTask( | 1466 |
1460 start_time, end_time - start_time); | 1467 MainThreadOnly().queueing_time_estimator.OnToplevelTaskCompleted( |
| 1468 start_time_ticks, end_time_ticks); |
1461 // We want to measure thread time here, but for efficiency reasons | 1469 // We want to measure thread time here, but for efficiency reasons |
1462 // we stick with wall time. | 1470 // we stick with wall time. |
1463 MainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime( | 1471 MainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime( |
1464 start_time, end_time); | 1472 start_time_ticks, end_time_ticks); |
1465 MainThreadOnly().background_main_thread_load_tracker.RecordTaskTime( | 1473 MainThreadOnly().background_main_thread_load_tracker.RecordTaskTime( |
1466 start_time, end_time); | 1474 start_time_ticks, end_time_ticks); |
1467 // TODO(altimin): Per-page metrics should also be considered. | 1475 // TODO(altimin): Per-page metrics should also be considered. |
1468 UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime", | 1476 UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime", |
1469 (end_time - start_time).InMicroseconds(), 1, | 1477 (end_time_ticks - start_time_ticks).InMicroseconds
(), 1, |
1470 1000000, 50); | 1478 1000000, 50); |
1471 } | 1479 } |
1472 | 1480 |
1473 LongTaskTracker::LongTaskTiming RendererSchedulerImpl::GetLongTaskTiming() { | 1481 void RendererSchedulerImpl::AddTaskTimeObserver( |
1474 return MainThreadOnly().long_task_tracker.GetLongTaskTiming(); | 1482 TaskTimeObserver* task_time_observer) { |
| 1483 helper_.AddTaskTimeObserver(task_time_observer); |
| 1484 } |
| 1485 |
| 1486 void RendererSchedulerImpl::RemoveTaskTimeObserver( |
| 1487 TaskTimeObserver* task_time_observer) { |
| 1488 helper_.RemoveTaskTimeObserver(task_time_observer); |
1475 } | 1489 } |
1476 | 1490 |
1477 void RendererSchedulerImpl::OnQueueingTimeForWindowEstimated( | 1491 void RendererSchedulerImpl::OnQueueingTimeForWindowEstimated( |
1478 base::TimeDelta queueing_time) { | 1492 base::TimeDelta queueing_time) { |
1479 UMA_HISTOGRAM_TIMES("RendererScheduler.ExpectedTaskQueueingDuration", | 1493 UMA_HISTOGRAM_TIMES("RendererScheduler.ExpectedTaskQueueingDuration", |
1480 queueing_time); | 1494 queueing_time); |
1481 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 1495 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
1482 "estimated_queueing_time_for_window", | 1496 "estimated_queueing_time_for_window", |
1483 queueing_time.InMillisecondsF()); | 1497 queueing_time.InMillisecondsF()); |
1484 } | 1498 } |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1540 case v8::PERFORMANCE_LOAD: | 1554 case v8::PERFORMANCE_LOAD: |
1541 return "load"; | 1555 return "load"; |
1542 default: | 1556 default: |
1543 NOTREACHED(); | 1557 NOTREACHED(); |
1544 return nullptr; | 1558 return nullptr; |
1545 } | 1559 } |
1546 } | 1560 } |
1547 | 1561 |
1548 } // namespace scheduler | 1562 } // namespace scheduler |
1549 } // namespace blink | 1563 } // namespace blink |
OLD | NEW |