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

Side by Side Diff: base/metrics/stats_counters.h

Issue 935333002: Update from https://crrev.com/316786 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 10 months 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 unified diff | Download patch
« no previous file with comments | « base/metrics/histogram_macros_unittest.cc ('k') | base/metrics/stats_counters.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2011 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 #ifndef BASE_METRICS_STATS_COUNTERS_H_
6 #define BASE_METRICS_STATS_COUNTERS_H_
7
8 #include <string>
9
10 #include "base/base_export.h"
11 #include "base/compiler_specific.h"
12 #include "base/metrics/stats_table.h"
13 #include "base/time/time.h"
14
15 namespace base {
16
17 // StatsCounters are dynamically created values which can be tracked in
18 // the StatsTable. They are designed to be lightweight to create and
19 // easy to use.
20 //
21 // Since StatsCounters can be created dynamically by name, there is
22 // a hash table lookup to find the counter in the table. A StatsCounter
23 // object can be created once and used across multiple threads safely.
24 //
25 // Example usage:
26 // {
27 // StatsCounter request_count("RequestCount");
28 // request_count.Increment();
29 // }
30 //
31 // Note that creating counters on the stack does work, however creating
32 // the counter object requires a hash table lookup. For inner loops, it
33 // may be better to create the counter either as a member of another object
34 // (or otherwise outside of the loop) for maximum performance.
35 //
36 // Internally, a counter represents a value in a row of a StatsTable.
37 // The row has a 32bit value for each process/thread in the table and also
38 // a name (stored in the table metadata).
39 //
40 // NOTE: In order to make stats_counters usable in lots of different code,
41 // avoid any dependencies inside this header file.
42 //
43
44 //------------------------------------------------------------------------------
45 // Define macros for ease of use. They also allow us to change definitions
46 // as the implementation varies, or depending on compile options.
47 //------------------------------------------------------------------------------
48 // First provide generic macros, which exist in production as well as debug.
49 #define STATS_COUNTER(name, delta) do { \
50 base::StatsCounter counter(name); \
51 counter.Add(delta); \
52 } while (0)
53
54 #define SIMPLE_STATS_COUNTER(name) STATS_COUNTER(name, 1)
55
56 #define RATE_COUNTER(name, duration) do { \
57 base::StatsRate hit_count(name); \
58 hit_count.AddTime(duration); \
59 } while (0)
60
61 // Define Debug vs non-debug flavors of macros.
62 #ifndef NDEBUG
63
64 #define DSTATS_COUNTER(name, delta) STATS_COUNTER(name, delta)
65 #define DSIMPLE_STATS_COUNTER(name) SIMPLE_STATS_COUNTER(name)
66 #define DRATE_COUNTER(name, duration) RATE_COUNTER(name, duration)
67
68 #else // NDEBUG
69
70 #define DSTATS_COUNTER(name, delta) do {} while (0)
71 #define DSIMPLE_STATS_COUNTER(name) do {} while (0)
72 #define DRATE_COUNTER(name, duration) do {} while (0)
73
74 #endif // NDEBUG
75
76 //------------------------------------------------------------------------------
77 // StatsCounter represents a counter in the StatsTable class.
78 class BASE_EXPORT StatsCounter {
79 public:
80 // Create a StatsCounter object.
81 explicit StatsCounter(const std::string& name);
82 virtual ~StatsCounter();
83
84 // Sets the counter to a specific value.
85 void Set(int value);
86
87 // Increments the counter.
88 void Increment() {
89 Add(1);
90 }
91
92 virtual void Add(int value);
93
94 // Decrements the counter.
95 void Decrement() {
96 Add(-1);
97 }
98
99 void Subtract(int value) {
100 Add(-value);
101 }
102
103 // Is this counter enabled?
104 // Returns false if table is full.
105 bool Enabled() {
106 return GetPtr() != NULL;
107 }
108
109 int value() {
110 int* loc = GetPtr();
111 if (loc) return *loc;
112 return 0;
113 }
114
115 protected:
116 StatsCounter();
117
118 // Returns the cached address of this counter location.
119 int* GetPtr();
120
121 std::string name_;
122 // The counter id in the table. We initialize to -1 (an invalid value)
123 // and then cache it once it has been looked up. The counter_id is
124 // valid across all threads and processes.
125 int32 counter_id_;
126 };
127
128
129 // A StatsCounterTimer is a StatsCounter which keeps a timer during
130 // the scope of the StatsCounterTimer. On destruction, it will record
131 // its time measurement.
132 class BASE_EXPORT StatsCounterTimer : protected StatsCounter {
133 public:
134 // Constructs and starts the timer.
135 explicit StatsCounterTimer(const std::string& name);
136 ~StatsCounterTimer() override;
137
138 // Start the timer.
139 void Start();
140
141 // Stop the timer and record the results.
142 void Stop();
143
144 // Returns true if the timer is running.
145 bool Running();
146
147 // Accept a TimeDelta to increment.
148 virtual void AddTime(TimeDelta time);
149
150 protected:
151 // Compute the delta between start and stop, in milliseconds.
152 void Record();
153
154 TimeTicks start_time_;
155 TimeTicks stop_time_;
156 };
157
158 // A StatsRate is a timer that keeps a count of the number of intervals added so
159 // that several statistics can be produced:
160 // min, max, avg, count, total
161 class BASE_EXPORT StatsRate : public StatsCounterTimer {
162 public:
163 // Constructs and starts the timer.
164 explicit StatsRate(const std::string& name);
165 ~StatsRate() override;
166
167 void Add(int value) override;
168
169 private:
170 StatsCounter counter_;
171 StatsCounter largest_add_;
172 };
173
174
175 // Helper class for scoping a timer or rate.
176 template<class T> class StatsScope {
177 public:
178 explicit StatsScope<T>(T& timer)
179 : timer_(timer) {
180 timer_.Start();
181 }
182
183 ~StatsScope() {
184 timer_.Stop();
185 }
186
187 void Stop() {
188 timer_.Stop();
189 }
190
191 private:
192 T& timer_;
193 };
194
195 } // namespace base
196
197 #endif // BASE_METRICS_STATS_COUNTERS_H_
OLDNEW
« no previous file with comments | « base/metrics/histogram_macros_unittest.cc ('k') | base/metrics/stats_counters.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698