OLD | NEW |
| (Empty) |
1 // Copyright 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. | |
4 | |
5 #include "ui/base/latency_info.h" | |
6 | |
7 #include <algorithm> | |
8 | |
9 namespace ui { | |
10 | |
11 LatencyInfo::LatencyInfo() { | |
12 } | |
13 | |
14 LatencyInfo::~LatencyInfo() { | |
15 } | |
16 | |
17 void LatencyInfo::MergeWith(const LatencyInfo& other) { | |
18 for (LatencyMap::const_iterator it = other.latency_components.begin(); | |
19 it != other.latency_components.end(); | |
20 ++it) { | |
21 AddLatencyNumberWithTimestamp(it->first.first, | |
22 it->first.second, | |
23 it->second.sequence_number, | |
24 it->second.event_time, | |
25 it->second.event_count); | |
26 } | |
27 } | |
28 | |
29 void LatencyInfo::AddNewLatencyFrom(const LatencyInfo& other) { | |
30 for (LatencyMap::const_iterator it = other.latency_components.begin(); | |
31 it != other.latency_components.end(); | |
32 ++it) { | |
33 if (!FindLatency(it->first.first, it->first.second, NULL)) { | |
34 AddLatencyNumberWithTimestamp(it->first.first, | |
35 it->first.second, | |
36 it->second.sequence_number, | |
37 it->second.event_time, | |
38 it->second.event_count); | |
39 } | |
40 } | |
41 } | |
42 | |
43 void LatencyInfo::AddLatencyNumber(LatencyComponentType component, | |
44 int64 id, | |
45 int64 component_sequence_number) { | |
46 AddLatencyNumberWithTimestamp(component, id, component_sequence_number, | |
47 base::TimeTicks::HighResNow(), 1); | |
48 } | |
49 | |
50 void LatencyInfo::AddLatencyNumberWithTimestamp(LatencyComponentType component, | |
51 int64 id, | |
52 int64 component_sequence_number, | |
53 base::TimeTicks time, | |
54 uint32 event_count) { | |
55 LatencyMap::key_type key = std::make_pair(component, id); | |
56 LatencyMap::iterator it = latency_components.find(key); | |
57 if (it == latency_components.end()) { | |
58 LatencyComponent info = {component_sequence_number, time, event_count}; | |
59 latency_components[key] = info; | |
60 return; | |
61 } | |
62 it->second.sequence_number = std::max(component_sequence_number, | |
63 it->second.sequence_number); | |
64 uint32 new_count = event_count + it->second.event_count; | |
65 if (event_count > 0 && new_count != 0) { | |
66 // Do a weighted average, so that the new event_time is the average of | |
67 // the times of events currently in this structure with the time passed | |
68 // into this method. | |
69 it->second.event_time += (time - it->second.event_time) * event_count / | |
70 new_count; | |
71 it->second.event_count = new_count; | |
72 } | |
73 } | |
74 | |
75 bool LatencyInfo::FindLatency(LatencyComponentType type, | |
76 int64 id, | |
77 LatencyComponent* output) const { | |
78 LatencyMap::const_iterator it = latency_components.find( | |
79 std::make_pair(type, id)); | |
80 if (it == latency_components.end()) | |
81 return false; | |
82 if (output) | |
83 *output = it->second; | |
84 return true; | |
85 } | |
86 | |
87 void LatencyInfo::Clear() { | |
88 latency_components.clear(); | |
89 } | |
90 | |
91 } // namespace ui | |
OLD | NEW |