| Index: cc/scheduler/compositor_timing_history.cc
|
| diff --git a/cc/scheduler/compositor_timing_history.cc b/cc/scheduler/compositor_timing_history.cc
|
| index 34726d5ddf8795792d6f0fa7a85aeef5ba9193de..8c1bbe366d61c1201e2c4296103e698435ee5f47 100644
|
| --- a/cc/scheduler/compositor_timing_history.cc
|
| +++ b/cc/scheduler/compositor_timing_history.cc
|
| @@ -17,6 +17,15 @@ class CompositorTimingHistory::UMAReporter {
|
| virtual void AddBeginMainFrameToCommitDuration(base::TimeDelta duration,
|
| base::TimeDelta estimate,
|
| bool affects_estimate) = 0;
|
| + virtual void AddBeginMainFrameQueueDurationCriticalDuration(
|
| + base::TimeDelta duration,
|
| + bool affects_estimate) = 0;
|
| + virtual void AddBeginMainFrameQueueDurationNotCriticalDuration(
|
| + base::TimeDelta duration,
|
| + bool affects_estimate) = 0;
|
| + virtual void AddBeginMainFrameStartToCommitDuration(
|
| + base::TimeDelta duration,
|
| + bool affects_estimate) = 0;
|
| virtual void AddCommitToReadyToActivateDuration(base::TimeDelta duration,
|
| base::TimeDelta estimate,
|
| bool affects_estimate) = 0;
|
| @@ -39,6 +48,9 @@ namespace {
|
| // TODO(brianderson): Fine tune the percentiles below.
|
| const size_t kDurationHistorySize = 60;
|
| const double kBeginMainFrameToCommitEstimationPercentile = 90.0;
|
| +const double kBeginMainFrameQueueDurationCriticalEstimationPercentile = 90.0;
|
| +const double kBeginMainFrameQueueDurationNotCriticalEstimationPercentile = 90.0;
|
| +const double kBeginMainFrameStartToCommitEstimationPercentile = 90.0;
|
| const double kCommitToReadyToActivateEstimationPercentile = 90.0;
|
| const double kPrepareTilesEstimationPercentile = 90.0;
|
| const double kActivateEstimationPercentile = 90.0;
|
| @@ -77,6 +89,7 @@ void DeprecatedDrawDurationUMA(base::TimeDelta duration,
|
| kUmaDurationMinMicros, kUmaDurationMaxMicros, \
|
| kUmaDurationBucketCount);
|
|
|
| +// Records over/under estimates.
|
| #define REPORT_COMPOSITOR_TIMING_HISTORY_UMA(category, subcategory) \
|
| do { \
|
| base::TimeDelta duration_overestimate; \
|
| @@ -100,6 +113,18 @@ void DeprecatedDrawDurationUMA(base::TimeDelta duration,
|
| } \
|
| } while (false)
|
|
|
| +// Does not record over/under estimates.
|
| +#define REPORT_COMPOSITOR_TIMING_HISTORY_UMA2(category, subcategory) \
|
| + do { \
|
| + UMA_HISTOGRAM_CUSTOM_TIMES_MICROS("Scheduling." category "." subcategory, \
|
| + duration); \
|
| + if (!affects_estimate) { \
|
| + UMA_HISTOGRAM_CUSTOM_TIMES_MICROS("Scheduling." category "." subcategory \
|
| + ".NotUsedForEstimate", \
|
| + duration); \
|
| + } \
|
| + } while (false)
|
| +
|
| class RendererUMAReporter : public CompositorTimingHistory::UMAReporter {
|
| public:
|
| ~RendererUMAReporter() override {}
|
| @@ -110,6 +135,26 @@ class RendererUMAReporter : public CompositorTimingHistory::UMAReporter {
|
| REPORT_COMPOSITOR_TIMING_HISTORY_UMA("Renderer", "BeginMainFrameToCommit");
|
| }
|
|
|
| + void AddBeginMainFrameQueueDurationCriticalDuration(
|
| + base::TimeDelta duration,
|
| + bool affects_estimate) override {
|
| + REPORT_COMPOSITOR_TIMING_HISTORY_UMA2(
|
| + "Renderer", "BeginMainFrameQueueDurationCritical");
|
| + }
|
| +
|
| + void AddBeginMainFrameQueueDurationNotCriticalDuration(
|
| + base::TimeDelta duration,
|
| + bool affects_estimate) override {
|
| + REPORT_COMPOSITOR_TIMING_HISTORY_UMA2(
|
| + "Renderer", "BeginMainFrameQueueDurationNotCritical");
|
| + }
|
| +
|
| + void AddBeginMainFrameStartToCommitDuration(base::TimeDelta duration,
|
| + bool affects_estimate) override {
|
| + REPORT_COMPOSITOR_TIMING_HISTORY_UMA2(
|
| + "Renderer", "BeginMainFrameStartToCommitDuration");
|
| + }
|
| +
|
| void AddCommitToReadyToActivateDuration(base::TimeDelta duration,
|
| base::TimeDelta estimate,
|
| bool affects_estimate) override {
|
| @@ -146,6 +191,26 @@ class BrowserUMAReporter : public CompositorTimingHistory::UMAReporter {
|
| REPORT_COMPOSITOR_TIMING_HISTORY_UMA("Browser", "BeginMainFrameToCommit");
|
| }
|
|
|
| + void AddBeginMainFrameQueueDurationCriticalDuration(
|
| + base::TimeDelta duration,
|
| + bool affects_estimate) override {
|
| + REPORT_COMPOSITOR_TIMING_HISTORY_UMA2(
|
| + "Browser", "BeginMainFrameQueueDurationCritical");
|
| + }
|
| +
|
| + void AddBeginMainFrameQueueDurationNotCriticalDuration(
|
| + base::TimeDelta duration,
|
| + bool affects_estimate) override {
|
| + REPORT_COMPOSITOR_TIMING_HISTORY_UMA2(
|
| + "Browser", "BeginMainFrameQueueDurationNotCritical");
|
| + }
|
| +
|
| + void AddBeginMainFrameStartToCommitDuration(base::TimeDelta duration,
|
| + bool affects_estimate) override {
|
| + REPORT_COMPOSITOR_TIMING_HISTORY_UMA2("Browser",
|
| + "BeginMainFrameStartToCommit");
|
| + }
|
| +
|
| void AddCommitToReadyToActivateDuration(base::TimeDelta duration,
|
| base::TimeDelta estimate,
|
| bool affects_estimate) override {
|
| @@ -175,15 +240,23 @@ class BrowserUMAReporter : public CompositorTimingHistory::UMAReporter {
|
| class NullUMAReporter : public CompositorTimingHistory::UMAReporter {
|
| public:
|
| ~NullUMAReporter() override {}
|
| - void AddPrepareTilesDuration(base::TimeDelta duration,
|
| - base::TimeDelta estimate,
|
| - bool affects_estimate) override {}
|
| void AddBeginMainFrameToCommitDuration(base::TimeDelta duration,
|
| base::TimeDelta estimate,
|
| bool affects_estimate) override {}
|
| + void AddBeginMainFrameQueueDurationCriticalDuration(
|
| + base::TimeDelta duration,
|
| + bool affects_estimate) override {}
|
| + void AddBeginMainFrameQueueDurationNotCriticalDuration(
|
| + base::TimeDelta duration,
|
| + bool affects_estimate) override {}
|
| + void AddBeginMainFrameStartToCommitDuration(base::TimeDelta duration,
|
| + bool affects_estimate) override {}
|
| void AddCommitToReadyToActivateDuration(base::TimeDelta duration,
|
| base::TimeDelta estimate,
|
| bool affects_estimate) override {}
|
| + void AddPrepareTilesDuration(base::TimeDelta duration,
|
| + base::TimeDelta estimate,
|
| + bool affects_estimate) override {}
|
| void AddActivateDuration(base::TimeDelta duration,
|
| base::TimeDelta estimate,
|
| bool affects_estimate) override {}
|
| @@ -198,11 +271,16 @@ CompositorTimingHistory::CompositorTimingHistory(
|
| UMACategory uma_category,
|
| RenderingStatsInstrumentation* rendering_stats_instrumentation)
|
| : enabled_(false),
|
| - begin_main_frame_to_commit_duration_history_(kDurationHistorySize),
|
| + begin_main_frame_sent_to_commit_duration_history_(kDurationHistorySize),
|
| + begin_main_frame_queue_duration_critical_history_(kDurationHistorySize),
|
| + begin_main_frame_queue_duration_not_critical_history_(
|
| + kDurationHistorySize),
|
| + begin_main_frame_start_to_commit_duration_history_(kDurationHistorySize),
|
| commit_to_ready_to_activate_duration_history_(kDurationHistorySize),
|
| prepare_tiles_duration_history_(kDurationHistorySize),
|
| activate_duration_history_(kDurationHistorySize),
|
| draw_duration_history_(kDurationHistorySize),
|
| + begin_main_frame_on_critical_path_(false),
|
| uma_reporter_(CreateUMAReporter(uma_category)),
|
| rendering_stats_instrumentation_(rendering_stats_instrumentation) {}
|
|
|
| @@ -250,11 +328,30 @@ void CompositorTimingHistory::SetRecordingEnabled(bool enabled) {
|
|
|
| base::TimeDelta
|
| CompositorTimingHistory::BeginMainFrameToCommitDurationEstimate() const {
|
| - return begin_main_frame_to_commit_duration_history_.Percentile(
|
| + return begin_main_frame_sent_to_commit_duration_history_.Percentile(
|
| kBeginMainFrameToCommitEstimationPercentile);
|
| }
|
|
|
| base::TimeDelta
|
| +CompositorTimingHistory::BeginMainFrameQueueDurationCriticalEstimate() const {
|
| + return begin_main_frame_queue_duration_critical_history_.Percentile(
|
| + kBeginMainFrameQueueDurationCriticalEstimationPercentile);
|
| +}
|
| +
|
| +base::TimeDelta
|
| +CompositorTimingHistory::BeginMainFrameQueueDurationNotCriticalEstimate()
|
| + const {
|
| + return begin_main_frame_queue_duration_not_critical_history_.Percentile(
|
| + kBeginMainFrameQueueDurationNotCriticalEstimationPercentile);
|
| +}
|
| +
|
| +base::TimeDelta
|
| +CompositorTimingHistory::BeginMainFrameStartToCommitDurationEstimate() const {
|
| + return begin_main_frame_start_to_commit_duration_history_.Percentile(
|
| + kBeginMainFrameStartToCommitEstimationPercentile);
|
| +}
|
| +
|
| +base::TimeDelta
|
| CompositorTimingHistory::CommitToReadyToActivateDurationEstimate() const {
|
| return commit_to_ready_to_activate_duration_history_.Percentile(
|
| kCommitToReadyToActivateEstimationPercentile);
|
| @@ -273,11 +370,19 @@ base::TimeDelta CompositorTimingHistory::DrawDurationEstimate() const {
|
| return draw_duration_history_.Percentile(kDrawEstimationPercentile);
|
| }
|
|
|
| -void CompositorTimingHistory::WillBeginMainFrame() {
|
| +void CompositorTimingHistory::WillBeginMainFrame(bool on_critical_path) {
|
| DCHECK_EQ(base::TimeTicks(), begin_main_frame_sent_time_);
|
| + begin_main_frame_on_critical_path_ = on_critical_path;
|
| begin_main_frame_sent_time_ = Now();
|
| }
|
|
|
| +void CompositorTimingHistory::BeginMainFrameStarted(
|
| + base::TimeTicks main_thread_start_time) {
|
| + DCHECK_NE(base::TimeTicks(), begin_main_frame_sent_time_);
|
| + DCHECK_EQ(base::TimeTicks(), begin_main_frame_start_time_);
|
| + begin_main_frame_start_time_ = main_thread_start_time;
|
| +}
|
| +
|
| void CompositorTimingHistory::BeginMainFrameAborted() {
|
| DidCommit();
|
| }
|
| @@ -287,26 +392,62 @@ void CompositorTimingHistory::DidCommit() {
|
|
|
| commit_time_ = Now();
|
|
|
| - base::TimeDelta begin_main_frame_to_commit_duration =
|
| + // If the BeginMainFrame start time isn't know, assume it was immediate
|
| + // for scheduling purposes, but don't report it for UMA to avoid skewing
|
| + // the results.
|
| + bool begin_main_frame_start_time_is_valid =
|
| + !begin_main_frame_start_time_.is_null();
|
| + if (!begin_main_frame_start_time_is_valid)
|
| + begin_main_frame_start_time_ = begin_main_frame_sent_time_;
|
| +
|
| + base::TimeDelta begin_main_frame_sent_to_commit_duration =
|
| commit_time_ - begin_main_frame_sent_time_;
|
| + base::TimeDelta begin_main_frame_queue_duration =
|
| + begin_main_frame_start_time_ - begin_main_frame_sent_time_;
|
| + base::TimeDelta begin_main_frame_start_to_commit_duration =
|
| + commit_time_ - begin_main_frame_start_time_;
|
|
|
| // Before adding the new data point to the timing history, see what we would
|
| // have predicted for this frame. This allows us to keep track of the accuracy
|
| // of our predictions.
|
| - base::TimeDelta begin_main_frame_to_commit_estimate =
|
| + base::TimeDelta begin_main_frame_sent_to_commit_estimate =
|
| BeginMainFrameToCommitDurationEstimate();
|
| uma_reporter_->AddBeginMainFrameToCommitDuration(
|
| - begin_main_frame_to_commit_duration, begin_main_frame_to_commit_estimate,
|
| - enabled_);
|
| + begin_main_frame_sent_to_commit_duration,
|
| + begin_main_frame_sent_to_commit_estimate, enabled_);
|
| rendering_stats_instrumentation_->AddBeginMainFrameToCommitDuration(
|
| - begin_main_frame_to_commit_duration, begin_main_frame_to_commit_estimate);
|
| + begin_main_frame_sent_to_commit_duration,
|
| + begin_main_frame_sent_to_commit_estimate);
|
| +
|
| + if (begin_main_frame_start_time_is_valid) {
|
| + if (begin_main_frame_on_critical_path_) {
|
| + uma_reporter_->AddBeginMainFrameQueueDurationCriticalDuration(
|
| + begin_main_frame_queue_duration, enabled_);
|
| + } else {
|
| + uma_reporter_->AddBeginMainFrameQueueDurationNotCriticalDuration(
|
| + begin_main_frame_queue_duration, enabled_);
|
| + }
|
| + }
|
| +
|
| + uma_reporter_->AddBeginMainFrameStartToCommitDuration(
|
| + begin_main_frame_start_to_commit_duration, enabled_);
|
|
|
| if (enabled_) {
|
| - begin_main_frame_to_commit_duration_history_.InsertSample(
|
| - begin_main_frame_to_commit_duration);
|
| + begin_main_frame_sent_to_commit_duration_history_.InsertSample(
|
| + begin_main_frame_sent_to_commit_duration);
|
| + if (begin_main_frame_on_critical_path_) {
|
| + begin_main_frame_queue_duration_critical_history_.InsertSample(
|
| + begin_main_frame_queue_duration);
|
| + } else {
|
| + begin_main_frame_queue_duration_not_critical_history_.InsertSample(
|
| + begin_main_frame_queue_duration);
|
| + }
|
| + begin_main_frame_start_to_commit_duration_history_.InsertSample(
|
| + begin_main_frame_start_to_commit_duration);
|
| }
|
|
|
| begin_main_frame_sent_time_ = base::TimeTicks();
|
| + begin_main_frame_start_time_ = base::TimeTicks();
|
| }
|
|
|
| void CompositorTimingHistory::WillPrepareTiles() {
|
|
|