| 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 |