1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "cc/debug/latency_info.h"
11 LatencyInfo::LatencyInfo() {
14 LatencyInfo::~LatencyInfo() {
17 void LatencyInfo::MergeWith(const LatencyInfo
& other
) {
18 for (LatencyMap::const_iterator b
= other
.latency_components
.begin();
19 b
!= other
.latency_components
.end(); ++b
) {
20 AddLatencyNumberWithTimestamp(b
->first
.first
, b
->first
.second
,
21 b
->second
.sequence_number
,
23 b
->second
.event_count
);
27 void LatencyInfo::AddLatencyNumber(LatencyComponentType component
,
28 int64 id
, int64 component_sequence_number
) {
29 AddLatencyNumberWithTimestamp(component
, id
, component_sequence_number
,
30 base::TimeTicks::Now(), 1);
33 void LatencyInfo::AddLatencyNumberWithTimestamp(
34 LatencyComponentType component
, int64 id
, int64 component_sequence_number
,
35 base::TimeTicks time
, uint32 event_count
) {
36 LatencyMap::key_type key
= std::make_pair(component
, id
);
37 LatencyMap::iterator f
= latency_components
.find(key
);
38 if (f
== latency_components
.end()) {
39 LatencyComponent info
= {component_sequence_number
, time
, event_count
};
40 latency_components
[key
] = info
;
42 f
->second
.sequence_number
= std::max(component_sequence_number
,
43 f
->second
.sequence_number
);
44 uint32 new_count
= event_count
+ f
->second
.event_count
;
45 if (event_count
> 0 && new_count
!= 0) {
46 // Do a weighted average, so that the new event_time is the average of
47 // the times of events currently in this structure with the time passed
49 f
->second
.event_time
+= (time
- f
->second
.event_time
) * event_count
/
51 f
->second
.event_count
= new_count
;
56 void LatencyInfo::Clear() {
57 latency_components
.clear();