1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_HISTOGRAM_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HISTOGRAM_H_
#include <stdint.h>
#include "base/metrics/histogram_base.h"
#include "base/metrics/histogram_macros.h"
#include "base/time/tick_clock.h"
#include "third_party/blink/renderer/platform/platform_export.h"
#include "third_party/blink/renderer/platform/wtf/time.h"
namespace base {
class HistogramBase;
};
namespace blink {
class PLATFORM_EXPORT CustomCountHistogram {
public:
// Min values should be >=1 as emitted 0s still go into the underflow bucket.
CustomCountHistogram(const char* name,
base::HistogramBase::Sample min,
base::HistogramBase::Sample max,
int32_t bucket_count);
void Count(base::HistogramBase::Sample);
void CountMicroseconds(base::TimeDelta);
protected:
explicit CustomCountHistogram(base::HistogramBase*);
base::HistogramBase* histogram_;
};
class PLATFORM_EXPORT BooleanHistogram : public CustomCountHistogram {
public:
BooleanHistogram(const char* name);
};
class PLATFORM_EXPORT EnumerationHistogram : public CustomCountHistogram {
public:
// |boundaryValue| must be strictly greater than samples passed to |count|.
EnumerationHistogram(const char* name,
base::HistogramBase::Sample boundary_value);
};
class PLATFORM_EXPORT SparseHistogram {
public:
explicit SparseHistogram(const char* name);
void Sample(base::HistogramBase::Sample);
private:
base::HistogramBase* histogram_;
};
class PLATFORM_EXPORT LinearHistogram : public CustomCountHistogram {
public:
explicit LinearHistogram(const char* name,
base::HistogramBase::Sample min,
base::HistogramBase::Sample max,
int32_t bucket_count);
};
class PLATFORM_EXPORT ScopedUsHistogramTimer {
public:
explicit ScopedUsHistogramTimer(CustomCountHistogram& counter)
: start_time_(CurrentTimeTicks()), counter_(counter) {}
~ScopedUsHistogramTimer() {
counter_.CountMicroseconds(CurrentTimeTicks() - start_time_);
}
private:
TimeTicks start_time_;
CustomCountHistogram& counter_;
};
class PLATFORM_EXPORT ScopedHighResUsHistogramTimer {
public:
explicit ScopedHighResUsHistogramTimer(CustomCountHistogram& counter)
: start_time_(CurrentTimeTicks()), counter_(counter) {}
~ScopedHighResUsHistogramTimer() {
if (TimeTicks::IsHighResolution())
counter_.CountMicroseconds(CurrentTimeTicks() - start_time_);
}
private:
TimeTicks start_time_;
CustomCountHistogram& counter_;
};
#define SCOPED_BLINK_UMA_HISTOGRAM_TIMER_IMPL(name, allow_cross_thread) \
DEFINE_STATIC_LOCAL_IMPL(CustomCountHistogram, scoped_us_counter, \
(name, 0, 10000000, 50), allow_cross_thread); \
ScopedUsHistogramTimer timer(scoped_us_counter);
#define SCOPED_BLINK_UMA_HISTOGRAM_TIMER_HIGHRES_IMPL(name, \
allow_cross_thread) \
DEFINE_STATIC_LOCAL_IMPL(CustomCountHistogram, scoped_us_counter, \
(name, 0, 10000000, 50), allow_cross_thread); \
ScopedHighResUsHistogramTimer timer(scoped_us_counter);
// Use code like this to record time, in microseconds, to execute a block of
// code:
//
// {
// SCOPED_BLINK_UMA_HISTOGRAM_TIMER(myUmaStatName)
// RunMyCode();
// }
// This macro records all times between 0us and 10 seconds.
// Do not change this macro without renaming all metrics that use it!
#define SCOPED_BLINK_UMA_HISTOGRAM_TIMER(name) \
SCOPED_BLINK_UMA_HISTOGRAM_TIMER_IMPL(name, false)
// Only record samples when we have a high resolution timer
#define SCOPED_BLINK_UMA_HISTOGRAM_TIMER_HIGHRES(name) \
SCOPED_BLINK_UMA_HISTOGRAM_TIMER_HIGHRES_IMPL(name, false)
// Thread-safe variant of SCOPED_BLINK_UMA_HISTOGRAM_TIMER.
// Use if the histogram can be accessed by multiple threads.
#define SCOPED_BLINK_UMA_HISTOGRAM_TIMER_THREAD_SAFE(name) \
SCOPED_BLINK_UMA_HISTOGRAM_TIMER_IMPL(name, true)
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HISTOGRAM_H_
|