| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Histogram is an object that aggregates statistics, and can summarize them in | 5 // Histogram is an object that aggregates statistics, and can summarize them in |
| 6 // various forms, including ASCII graphical, HTML, and numerically (as a | 6 // various forms, including ASCII graphical, HTML, and numerically (as a |
| 7 // vector of numbers corresponding to each of the aggregating buckets). | 7 // vector of numbers corresponding to each of the aggregating buckets). |
| 8 | 8 |
| 9 // It supports calls to accumulate either time intervals (which are processed | 9 // It supports calls to accumulate either time intervals (which are processed |
| 10 // as integral number of milliseconds), or arbitrary integral units. | 10 // as integral number of milliseconds), or arbitrary integral units. |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 #define HISTOGRAM_COUNTS_100(name, sample) HISTOGRAM_CUSTOM_COUNTS( \ | 54 #define HISTOGRAM_COUNTS_100(name, sample) HISTOGRAM_CUSTOM_COUNTS( \ |
| 55 name, sample, 1, 100, 50) | 55 name, sample, 1, 100, 50) |
| 56 | 56 |
| 57 #define HISTOGRAM_COUNTS_10000(name, sample) HISTOGRAM_CUSTOM_COUNTS( \ | 57 #define HISTOGRAM_COUNTS_10000(name, sample) HISTOGRAM_CUSTOM_COUNTS( \ |
| 58 name, sample, 1, 10000, 50) | 58 name, sample, 1, 10000, 50) |
| 59 | 59 |
| 60 #define HISTOGRAM_CUSTOM_COUNTS(name, sample, min, max, bucket_count) do { \ | 60 #define HISTOGRAM_CUSTOM_COUNTS(name, sample, min, max, bucket_count) do { \ |
| 61 static scoped_refptr<Histogram> counter = Histogram::FactoryGet( \ | 61 static scoped_refptr<Histogram> counter = Histogram::FactoryGet( \ |
| 62 name, min, max, bucket_count, Histogram::kNoFlags); \ | 62 name, min, max, bucket_count, Histogram::kNoFlags); \ |
| 63 DCHECK_EQ(name, counter->histogram_name()); \ | 63 DCHECK_EQ(name, counter->histogram_name()); \ |
| 64 counter->Add(sample); \ | 64 if (counter.get()) counter->Add(sample); \ |
| 65 } while (0) | 65 } while (0) |
| 66 | 66 |
| 67 #define HISTOGRAM_PERCENTAGE(name, under_one_hundred) \ | 67 #define HISTOGRAM_PERCENTAGE(name, under_one_hundred) \ |
| 68 HISTOGRAM_ENUMERATION(name, under_one_hundred, 101) | 68 HISTOGRAM_ENUMERATION(name, under_one_hundred, 101) |
| 69 | 69 |
| 70 // For folks that need real specific times, use this to select a precise range | 70 // For folks that need real specific times, use this to select a precise range |
| 71 // of times you want plotted, and the number of buckets you want used. | 71 // of times you want plotted, and the number of buckets you want used. |
| 72 #define HISTOGRAM_CUSTOM_TIMES(name, sample, min, max, bucket_count) do { \ | 72 #define HISTOGRAM_CUSTOM_TIMES(name, sample, min, max, bucket_count) do { \ |
| 73 static scoped_refptr<Histogram> counter = Histogram::FactoryTimeGet( \ | 73 static scoped_refptr<Histogram> counter = Histogram::FactoryTimeGet( \ |
| 74 name, min, max, bucket_count, Histogram::kNoFlags); \ | 74 name, min, max, bucket_count, Histogram::kNoFlags); \ |
| 75 DCHECK_EQ(name, counter->histogram_name()); \ | 75 DCHECK_EQ(name, counter->histogram_name()); \ |
| 76 counter->AddTime(sample); \ | 76 if (counter.get()) counter->AddTime(sample); \ |
| 77 } while (0) | 77 } while (0) |
| 78 | 78 |
| 79 // DO NOT USE THIS. It is being phased out, in favor of HISTOGRAM_CUSTOM_TIMES. | 79 // DO NOT USE THIS. It is being phased out, in favor of HISTOGRAM_CUSTOM_TIMES. |
| 80 #define HISTOGRAM_CLIPPED_TIMES(name, sample, min, max, bucket_count) do { \ | 80 #define HISTOGRAM_CLIPPED_TIMES(name, sample, min, max, bucket_count) do { \ |
| 81 static scoped_refptr<Histogram> counter = Histogram::FactoryTimeGet( \ | 81 static scoped_refptr<Histogram> counter = Histogram::FactoryTimeGet( \ |
| 82 name, min, max, bucket_count, Histogram::kNoFlags); \ | 82 name, min, max, bucket_count, Histogram::kNoFlags); \ |
| 83 DCHECK_EQ(name, counter->histogram_name()); \ | 83 DCHECK_EQ(name, counter->histogram_name()); \ |
| 84 if ((sample) < (max)) counter->AddTime(sample); \ | 84 if ((sample) < (max) && counter.get()) counter->AddTime(sample); \ |
| 85 } while (0) | 85 } while (0) |
| 86 | 86 |
| 87 // Support histograming of an enumerated value. The samples should always be | 87 // Support histograming of an enumerated value. The samples should always be |
| 88 // less than boundary_value. | 88 // less than boundary_value. |
| 89 | 89 |
| 90 #define HISTOGRAM_ENUMERATION(name, sample, boundary_value) do { \ | 90 #define HISTOGRAM_ENUMERATION(name, sample, boundary_value) do { \ |
| 91 static scoped_refptr<Histogram> counter = LinearHistogram::FactoryGet( \ | 91 static scoped_refptr<Histogram> counter = LinearHistogram::FactoryGet( \ |
| 92 name, 1, boundary_value, boundary_value + 1, Histogram::kNoFlags); \ | 92 name, 1, boundary_value, boundary_value + 1, Histogram::kNoFlags); \ |
| 93 DCHECK_EQ(name, counter->histogram_name()); \ | 93 DCHECK_EQ(name, counter->histogram_name()); \ |
| 94 counter->Add(sample); \ | 94 if (counter.get()) counter->Add(sample); \ |
| 95 } while (0) | 95 } while (0) |
| 96 | 96 |
| 97 #define HISTOGRAM_CUSTOM_ENUMERATION(name, sample, custom_ranges) do { \ | 97 #define HISTOGRAM_CUSTOM_ENUMERATION(name, sample, custom_ranges) do { \ |
| 98 static scoped_refptr<Histogram> counter = CustomHistogram::FactoryGet( \ | 98 static scoped_refptr<Histogram> counter = CustomHistogram::FactoryGet( \ |
| 99 name, custom_ranges, Histogram::kNoFlags); \ | 99 name, custom_ranges, Histogram::kNoFlags); \ |
| 100 DCHECK_EQ(name, counter->histogram_name()); \ | 100 DCHECK_EQ(name, counter->histogram_name()); \ |
| 101 counter->Add(sample); \ | 101 if (counter.get()) counter->Add(sample); \ |
| 102 } while (0) | 102 } while (0) |
| 103 | 103 |
| 104 | 104 |
| 105 //------------------------------------------------------------------------------ | 105 //------------------------------------------------------------------------------ |
| 106 // Define Debug vs non-debug flavors of macros. | 106 // Define Debug vs non-debug flavors of macros. |
| 107 #ifndef NDEBUG | 107 #ifndef NDEBUG |
| 108 | 108 |
| 109 #define DHISTOGRAM_TIMES(name, sample) HISTOGRAM_TIMES(name, sample) | 109 #define DHISTOGRAM_TIMES(name, sample) HISTOGRAM_TIMES(name, sample) |
| 110 #define DHISTOGRAM_COUNTS(name, sample) HISTOGRAM_COUNTS(name, sample) | 110 #define DHISTOGRAM_COUNTS(name, sample) HISTOGRAM_COUNTS(name, sample) |
| 111 #define DHISTOGRAM_PERCENTAGE(name, under_one_hundred) HISTOGRAM_PERCENTAGE(\ | 111 #define DHISTOGRAM_PERCENTAGE(name, under_one_hundred) HISTOGRAM_PERCENTAGE(\ |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 | 154 |
| 155 // Use this macro when times can routinely be much longer than 10 seconds. | 155 // Use this macro when times can routinely be much longer than 10 seconds. |
| 156 #define UMA_HISTOGRAM_LONG_TIMES(name, sample) UMA_HISTOGRAM_CUSTOM_TIMES( \ | 156 #define UMA_HISTOGRAM_LONG_TIMES(name, sample) UMA_HISTOGRAM_CUSTOM_TIMES( \ |
| 157 name, sample, base::TimeDelta::FromMilliseconds(1), \ | 157 name, sample, base::TimeDelta::FromMilliseconds(1), \ |
| 158 base::TimeDelta::FromHours(1), 50) | 158 base::TimeDelta::FromHours(1), 50) |
| 159 | 159 |
| 160 #define UMA_HISTOGRAM_CUSTOM_TIMES(name, sample, min, max, bucket_count) do { \ | 160 #define UMA_HISTOGRAM_CUSTOM_TIMES(name, sample, min, max, bucket_count) do { \ |
| 161 static scoped_refptr<Histogram> counter = Histogram::FactoryTimeGet( \ | 161 static scoped_refptr<Histogram> counter = Histogram::FactoryTimeGet( \ |
| 162 name, min, max, bucket_count, Histogram::kUmaTargetedHistogramFlag); \ | 162 name, min, max, bucket_count, Histogram::kUmaTargetedHistogramFlag); \ |
| 163 DCHECK_EQ(name, counter->histogram_name()); \ | 163 DCHECK_EQ(name, counter->histogram_name()); \ |
| 164 counter->AddTime(sample); \ | 164 if (counter.get()) counter->AddTime(sample); \ |
| 165 } while (0) | 165 } while (0) |
| 166 | 166 |
| 167 // DO NOT USE THIS. It is being phased out, in favor of HISTOGRAM_CUSTOM_TIMES. | 167 // DO NOT USE THIS. It is being phased out, in favor of HISTOGRAM_CUSTOM_TIMES. |
| 168 #define UMA_HISTOGRAM_CLIPPED_TIMES(name, sample, min, max, bucket_count) do { \ | 168 #define UMA_HISTOGRAM_CLIPPED_TIMES(name, sample, min, max, bucket_count) do { \ |
| 169 static scoped_refptr<Histogram> counter = Histogram::FactoryTimeGet( \ | 169 static scoped_refptr<Histogram> counter = Histogram::FactoryTimeGet( \ |
| 170 name, min, max, bucket_count, Histogram::kUmaTargetedHistogramFlag); \ | 170 name, min, max, bucket_count, Histogram::kUmaTargetedHistogramFlag); \ |
| 171 DCHECK_EQ(name, counter->histogram_name()); \ | 171 DCHECK_EQ(name, counter->histogram_name()); \ |
| 172 if ((sample) < (max)) counter->AddTime(sample); \ | 172 if ((sample) < (max) && counter.get()) counter->AddTime(sample); \ |
| 173 } while (0) | 173 } while (0) |
| 174 | 174 |
| 175 #define UMA_HISTOGRAM_COUNTS(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS( \ | 175 #define UMA_HISTOGRAM_COUNTS(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS( \ |
| 176 name, sample, 1, 1000000, 50) | 176 name, sample, 1, 1000000, 50) |
| 177 | 177 |
| 178 #define UMA_HISTOGRAM_COUNTS_100(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS( \ | 178 #define UMA_HISTOGRAM_COUNTS_100(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS( \ |
| 179 name, sample, 1, 100, 50) | 179 name, sample, 1, 100, 50) |
| 180 | 180 |
| 181 #define UMA_HISTOGRAM_COUNTS_10000(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS( \ | 181 #define UMA_HISTOGRAM_COUNTS_10000(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS( \ |
| 182 name, sample, 1, 10000, 50) | 182 name, sample, 1, 10000, 50) |
| 183 | 183 |
| 184 #define UMA_HISTOGRAM_CUSTOM_COUNTS(name, sample, min, max, bucket_count) do { \ | 184 #define UMA_HISTOGRAM_CUSTOM_COUNTS(name, sample, min, max, bucket_count) do { \ |
| 185 static scoped_refptr<Histogram> counter = Histogram::FactoryGet( \ | 185 static scoped_refptr<Histogram> counter = Histogram::FactoryGet( \ |
| 186 name, min, max, bucket_count, Histogram::kUmaTargetedHistogramFlag); \ | 186 name, min, max, bucket_count, Histogram::kUmaTargetedHistogramFlag); \ |
| 187 DCHECK_EQ(name, counter->histogram_name()); \ | 187 DCHECK_EQ(name, counter->histogram_name()); \ |
| 188 counter->Add(sample); \ | 188 if (counter.get()) counter->Add(sample); \ |
| 189 } while (0) | 189 } while (0) |
| 190 | 190 |
| 191 #define UMA_HISTOGRAM_MEMORY_KB(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS( \ | 191 #define UMA_HISTOGRAM_MEMORY_KB(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS( \ |
| 192 name, sample, 1000, 500000, 50) | 192 name, sample, 1000, 500000, 50) |
| 193 | 193 |
| 194 #define UMA_HISTOGRAM_MEMORY_MB(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS( \ | 194 #define UMA_HISTOGRAM_MEMORY_MB(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS( \ |
| 195 name, sample, 1, 1000, 50) | 195 name, sample, 1, 1000, 50) |
| 196 | 196 |
| 197 #define UMA_HISTOGRAM_PERCENTAGE(name, under_one_hundred) \ | 197 #define UMA_HISTOGRAM_PERCENTAGE(name, under_one_hundred) \ |
| 198 UMA_HISTOGRAM_ENUMERATION(name, under_one_hundred, 101) | 198 UMA_HISTOGRAM_ENUMERATION(name, under_one_hundred, 101) |
| 199 | 199 |
| 200 #define UMA_HISTOGRAM_ENUMERATION(name, sample, boundary_value) do { \ | 200 #define UMA_HISTOGRAM_ENUMERATION(name, sample, boundary_value) do { \ |
| 201 static scoped_refptr<Histogram> counter = LinearHistogram::FactoryGet( \ | 201 static scoped_refptr<Histogram> counter = LinearHistogram::FactoryGet( \ |
| 202 name, 1, boundary_value, boundary_value + 1, \ | 202 name, 1, boundary_value, boundary_value + 1, \ |
| 203 Histogram::kUmaTargetedHistogramFlag); \ | 203 Histogram::kUmaTargetedHistogramFlag); \ |
| 204 DCHECK_EQ(name, counter->histogram_name()); \ | 204 DCHECK_EQ(name, counter->histogram_name()); \ |
| 205 counter->Add(sample); \ | 205 if (counter.get()) counter->Add(sample); \ |
| 206 } while (0) | 206 } while (0) |
| 207 | 207 |
| 208 #define UMA_HISTOGRAM_CUSTOM_ENUMERATION(name, sample, custom_ranges) do { \ | 208 #define UMA_HISTOGRAM_CUSTOM_ENUMERATION(name, sample, custom_ranges) do { \ |
| 209 static scoped_refptr<Histogram> counter = CustomHistogram::FactoryGet( \ | 209 static scoped_refptr<Histogram> counter = CustomHistogram::FactoryGet( \ |
| 210 name, custom_ranges, Histogram::kUmaTargetedHistogramFlag); \ | 210 name, custom_ranges, Histogram::kUmaTargetedHistogramFlag); \ |
| 211 DCHECK_EQ(name, counter->histogram_name()); \ | 211 DCHECK_EQ(name, counter->histogram_name()); \ |
| 212 counter->Add(sample); \ | 212 if (counter.get()) counter->Add(sample); \ |
| 213 } while (0) | 213 } while (0) |
| 214 | 214 |
| 215 //------------------------------------------------------------------------------ | 215 //------------------------------------------------------------------------------ |
| 216 | 216 |
| 217 class BooleanHistogram; | 217 class BooleanHistogram; |
| 218 class CustomHistogram; | 218 class CustomHistogram; |
| 219 class Histogram; | 219 class Histogram; |
| 220 class LinearHistogram; | 220 class LinearHistogram; |
| 221 class Pickle; | 221 class Pickle; |
| 222 | 222 |
| (...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 627 // lock protects access to the above map. | 627 // lock protects access to the above map. |
| 628 static Lock* lock_; | 628 static Lock* lock_; |
| 629 | 629 |
| 630 // Dump all known histograms to log. | 630 // Dump all known histograms to log. |
| 631 static bool dump_on_exit_; | 631 static bool dump_on_exit_; |
| 632 | 632 |
| 633 DISALLOW_COPY_AND_ASSIGN(StatisticsRecorder); | 633 DISALLOW_COPY_AND_ASSIGN(StatisticsRecorder); |
| 634 }; | 634 }; |
| 635 | 635 |
| 636 #endif // BASE_HISTOGRAM_H_ | 636 #endif // BASE_HISTOGRAM_H_ |
| OLD | NEW |