Use absolute value for intermediate AverageLag values
Area values generally should not be negative. With the existing code,
changes of direction during a report period will cancel out previously
accumulated lag.
Bug: 928843
Change-Id: I779d16b08e47c38fe0c33e807b5d8241fd5110cb
Reviewed-on: https://chromium-review.googlesource.com/c/1450751
Reviewed-by: Ella Ge <eirage@chromium.org>
Reviewed-by: Timothy Dresser <tdresser@chromium.org>
Commit-Queue: Daniel Libby <dlibby@microsoft.com>
Cr-Commit-Position: refs/heads/master@{#629702}
diff --git a/content/browser/renderer_host/input/render_widget_host_latency_tracker_unittest.cc b/content/browser/renderer_host/input/render_widget_host_latency_tracker_unittest.cc
index 5da41d3..33662f3 100644
--- a/content/browser/renderer_host/input/render_widget_host_latency_tracker_unittest.cc
+++ b/content/browser/renderer_host/input/render_widget_host_latency_tracker_unittest.cc
@@ -1237,13 +1237,15 @@
}
// Send 101 ScrollUpdate events to verify that there is 1 AverageLag record
// per 1 second.
- for (int i = 0; i <= 100; i++) {
+ const int kUpdates = 101;
+ for (int i = 0; i < kUpdates; i++) {
// ScrollUpdate
SyntheticWebTouchEvent touch;
touch.PressPoint(0, 0);
ui::LatencyInfo touch_latency(ui::SourceEventType::TOUCH);
- touch_latency.set_scroll_update_delta(10);
+ const int sign = (i < kUpdates / 2) ? 1 : -1;
+ touch_latency.set_scroll_update_delta(sign * 10);
event_time += base::TimeDelta::FromMilliseconds(10);
touch_latency.AddLatencyNumberWithTimestamp(
ui::INPUT_EVENT_LATENCY_SCROLL_UPDATE_ORIGINAL_COMPONENT, event_time,
diff --git a/ui/latency/latency_tracker.cc b/ui/latency/latency_tracker.cc
index 88d8346..d98a8e0 100644
--- a/ui/latency/latency_tracker.cc
+++ b/ui/latency/latency_tracker.cc
@@ -369,7 +369,7 @@
// creation time and gpu swap begin time.
pending_finished_lag_report_->lag =
(gpu_swap_begin_timestamp - event_timestamp).InMillisecondsF() *
- latency.scroll_update_delta();
+ std::abs(latency.scroll_update_delta());
// The next report time should be a least 1 second away from current report
// time.
next_report_time_ = pending_finished_lag_report_->report_time +
@@ -386,14 +386,14 @@
// average delta(current delta/2).
float pending_finger_move_lag =
(event_timestamp - last_event_timestamp_).InMillisecondsF() *
- latency.scroll_update_delta() / 2;
+ std::abs(latency.scroll_update_delta() / 2);
// |event_dispatch_lag| is the area between the current event creation time
// (i.e. last coalesced event of current event creation time) and gpu swap
// begin time of this event.
float event_dispatch_lag =
(gpu_swap_begin_timestamp - event_timestamp).InMillisecondsF() *
- latency.scroll_update_delta();
+ std::abs(latency.scroll_update_delta());
if (pending_finished_lag_report_) {
if (event_timestamp >= pending_finished_lag_report_->report_time) {
@@ -421,7 +421,7 @@
(gpu_swap_begin_timestamp -
pending_finished_lag_report_->report_time)
.InMillisecondsF() *
- latency.scroll_update_delta();
+ std::abs(latency.scroll_update_delta());
pending_finished_lag_report_->lag += pending_finger_move_lag +
event_dispatch_lag -
lag_after_report_time;
@@ -460,9 +460,10 @@
void LatencyTracker::ReportAverageLagUma(std::unique_ptr<LagData> report) {
if (report) {
DCHECK(!report->report_time.is_null());
+ DCHECK(report->lag >= 0.f);
base::UmaHistogramCounts1000(
"Event.Latency." + report->scroll_name + ".Touch.AverageLag",
- std::abs(report->lag) /
+ report->lag /
(report->report_time - last_reported_time_).InMillisecondsF());
last_reported_time_ = report->report_time;