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 92