Chromium Code Reviews| 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 fa6a06c86d0821630db268290ca2b6f145301b08..1eef3fb22bdac4188e023d3f024301fa361bca65 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 |
| @@ -14,6 +14,7 @@ |
| #include "base/trace_event/trace_event.h" |
| #include "base/trace_event/trace_event_argument.h" |
| #include "cc/output/begin_frame_args.h" |
| +#include "components/metrics/single_sample_metrics_factory_impl.h" |
| #include "platform/RuntimeEnabledFeatures.h" |
| #include "platform/scheduler/base/real_time_domain.h" |
| #include "platform/scheduler/base/task_queue_impl.h" |
| @@ -219,6 +220,7 @@ RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( |
| in_idle_period_for_testing(false), |
| use_virtual_time(false), |
| is_audio_playing(false), |
| + has_navigated(false), |
| rail_mode_observer(nullptr), |
| wake_up_budget_pool(nullptr), |
| task_duration_per_queue_type_histogram(base::Histogram::FactoryGet( |
| @@ -1631,6 +1633,25 @@ void RendererSchedulerImpl::RemovePendingNavigation(NavigatingFrameType type) { |
| } |
| } |
| +void RendererSchedulerImpl::OnCommitProvisionalLoad() { |
| + // Initialize |max_queueing_time_metric| lazily so that |
| + // |SingleSampleMetricsFactory::SetFactory()| is called before |
| + // |SingleSampleMetricsFactory::Get()| |
| + if (!GetMainThreadOnly().max_queueing_time_metric) { |
| + GetMainThreadOnly().max_queueing_time_metric = |
| + GetOrCreateMaxQueueingTimeMetric(); |
| + } |
| + GetMainThreadOnly().max_queueing_time_metric.reset(); |
| + GetMainThreadOnly().max_queueing_time = base::TimeDelta(); |
| + GetMainThreadOnly().has_navigated = true; |
| +} |
| + |
| +std::unique_ptr<base::SingleSampleMetric> |
| +RendererSchedulerImpl::GetOrCreateMaxQueueingTimeMetric() { |
| + return base::SingleSampleMetricsFactory::Get()->CreateCustomCountsMetric( |
|
Sami
2017/05/31 10:30:34
Based on the method name I would expect this to ca
Liquan (Max) Gu
2017/06/01 14:39:39
There is a difference between caching it in max_qu
Sami
2017/06/01 18:29:40
I see. This function seems to create a new metric
Liquan (Max) Gu
2017/06/01 18:36:05
Whoops, you are right.
|
| + "RendererScheduler.MaxQueueingTime", 1, 10000, 50); |
| +} |
| + |
| void RendererSchedulerImpl::OnNavigationStarted() { |
| TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
| "RendererSchedulerImpl::OnNavigationStarted"); |
| @@ -1907,6 +1928,18 @@ void RendererSchedulerImpl::RemoveTaskTimeObserver( |
| void RendererSchedulerImpl::OnQueueingTimeForWindowEstimated( |
| base::TimeDelta queueing_time, |
| base::TimeTicks window_start_time) { |
| + if (GetMainThreadOnly().has_navigated) { |
| + if (GetMainThreadOnly().max_queueing_time < queueing_time) { |
| + if (!GetMainThreadOnly().max_queueing_time_metric) { |
| + GetMainThreadOnly().max_queueing_time_metric = |
| + GetOrCreateMaxQueueingTimeMetric(); |
| + } |
| + GetMainThreadOnly().max_queueing_time_metric->SetSample( |
| + queueing_time.InMilliseconds()); |
| + GetMainThreadOnly().max_queueing_time = queueing_time; |
| + } |
| + } |
| + |
| // RendererScheduler reports the queueing time once per window's duration. |
| // |stepEQT|stepEQT|stepEQT|stepEQT|stepEQT|stepEQT| |
| // Report: |-------window EQT------| |