#pragma once
#include "rocksdb/perf_context.h"
#include "util/stop_watch.h"
namespace
rocksdb {
#if defined(NPERF_CONTEXT) || defined(IOS_CROSS_COMPILE)
#define PERF_TIMER_DECLARE()
#define PERF_TIMER_START(metric)
#define PERF_TIMER_AUTO(metric)
#define PERF_TIMER_MEASURE(metric)
#define PERF_TIMER_STOP(metric)
#define PERF_COUNTER_ADD(metric, value)
#else
extern
__thread PerfLevel perf_level;
class
PerfStepTimer {
public
:
PerfStepTimer()
: enabled_(perf_level >= PerfLevel::kEnableTime),
env_(enabled_ ? Env::Default() :
nullptr
),
start_(0) {
}
void
Start() {
if
(enabled_) {
start_ = env_->NowNanos();
}
}
void
Measure(uint64_t* metric) {
if
(start_) {
uint64_t now = env_->NowNanos();
*metric += now - start_;
start_ = now;
}
}
void
Stop(uint64_t* metric) {
if
(start_) {
*metric += env_->NowNanos() - start_;
start_ = 0;
}
}
private
:
const
bool
enabled_;
Env*
const
env_;
uint64_t start_;
};
#define PERF_TIMER_DECLARE() \
PerfStepTimer perf_step_timer;
#define PERF_TIMER_START(metric) \
perf_step_timer.Start();
#define PERF_TIMER_AUTO(metric) \
PerfStepTimer perf_step_timer; \
perf_step_timer.Start();
#define PERF_TIMER_MEASURE(metric) \
perf_step_timer.Measure(&(perf_context.metric));
#define PERF_TIMER_STOP(metric) \
perf_step_timer.Stop(&(perf_context.metric));
#define PERF_COUNTER_ADD(metric, value) \
perf_context.metric += value;
#endif
}