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() { |