15#ifndef BENCHMARK_PERF_COUNTERS_H
16#define BENCHMARK_PERF_COUNTERS_H
23#include "benchmark/benchmark.h"
28#ifndef BENCHMARK_OS_WINDOWS
35#pragma warning(disable : 4251)
53 BM_CHECK_LE(nr_counters_, kMaxCounters);
56 uint64_t operator[](
size_t pos)
const {
return values_[kPadding + pos]; }
58 static constexpr size_t kMaxCounters = 3;
64 std::pair<char*, size_t> get_data_buffer() {
65 return {
reinterpret_cast<char*
>(values_.data()),
66 sizeof(uint64_t) * (kPadding + nr_counters_)};
69 static constexpr size_t kPadding = 1;
70 std::array<uint64_t, kPadding + kMaxCounters> values_;
71 const size_t nr_counters_;
80 static const bool kSupported;
82 bool IsValid()
const {
return !counter_names_.empty(); }
93 static bool Initialize();
100 static PerfCounters Create(
const std::vector<std::string>& counter_names);
106#ifndef BENCHMARK_OS_WINDOWS
107 assert(values !=
nullptr);
109 auto buffer = values->get_data_buffer();
110 auto read_bytes = ::read(counter_ids_[0], buffer.first, buffer.second);
111 return static_cast<size_t>(read_bytes) == buffer.second;
118 const std::vector<std::string>& names()
const {
return counter_names_; }
119 size_t num_counters()
const {
return counter_names_.size(); }
122 PerfCounters(
const std::vector<std::string>& counter_names,
123 std::vector<int>&& counter_ids)
124 : counter_ids_(std::move(counter_ids)), counter_names_(counter_names) {}
127 void CloseCounters()
const;
129 std::vector<int> counter_ids_;
130 std::vector<std::string> counter_names_;
145 bool IsValid()
const {
147 return counters_.IsValid();
150 BENCHMARK_ALWAYS_INLINE
void Start() {
156 valid_read_ &= counters_.Snapshot(&start_values_);
160 BENCHMARK_ALWAYS_INLINE
bool Stop(
161 std::vector<std::pair<std::string, double>>& measurements) {
167 valid_read_ &= counters_.Snapshot(&end_values_);
170 for (
size_t i = 0; i < counters_.names().size(); ++i) {
171 double measurement =
static_cast<double>(end_values_[i]) -
172 static_cast<double>(start_values_[i]);
173 measurements.push_back({counters_.names()[i], measurement});
181 GUARDED_BY(mutex_)
static int ref_count_;
183 bool valid_read_ =
true;
188BENCHMARK_UNUSED
static bool perf_init_anchor = PerfCounters::Initialize();
Definition: perf_counters.h:50
Definition: perf_counters.h:134
Definition: perf_counters.h:77