Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3526)

Unified Diff: cc/scheduler/compositor_timing_history.cc

Issue 1432463002: cc: Track BeginMainFrame more precisely in CompositorTimingHistory. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase; fix typo Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/scheduler/compositor_timing_history.h ('k') | cc/scheduler/compositor_timing_history_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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() {
« no previous file with comments | « cc/scheduler/compositor_timing_history.h ('k') | cc/scheduler/compositor_timing_history_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698