| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
- // This source code is licensed under both the GPLv2 (found in the
- // COPYING file in the root directory) and Apache 2.0 License
- // (found in the LICENSE.Apache file in the root directory).
- //
- #pragma once
- #include "monitoring/perf_level_imp.h"
- #include "rocksdb/env.h"
- #include "util/stop_watch.h"
- namespace ROCKSDB_NAMESPACE {
- class PerfStepTimer {
- public:
- explicit PerfStepTimer(
- uint64_t* metric, Env* env = nullptr, bool use_cpu_time = false,
- PerfLevel enable_level = PerfLevel::kEnableTimeExceptForMutex,
- Statistics* statistics = nullptr, uint32_t ticker_type = 0)
- : perf_counter_enabled_(perf_level >= enable_level),
- use_cpu_time_(use_cpu_time),
- env_((perf_counter_enabled_ || statistics != nullptr)
- ? ((env != nullptr) ? env : Env::Default())
- : nullptr),
- start_(0),
- metric_(metric),
- statistics_(statistics),
- ticker_type_(ticker_type) {}
- ~PerfStepTimer() {
- Stop();
- }
- void Start() {
- if (perf_counter_enabled_ || statistics_ != nullptr) {
- start_ = time_now();
- }
- }
- uint64_t time_now() {
- if (!use_cpu_time_) {
- return env_->NowNanos();
- } else {
- return env_->NowCPUNanos();
- }
- }
- void Measure() {
- if (start_) {
- uint64_t now = time_now();
- *metric_ += now - start_;
- start_ = now;
- }
- }
- void Stop() {
- if (start_) {
- uint64_t duration = time_now() - start_;
- if (perf_counter_enabled_) {
- *metric_ += duration;
- }
- if (statistics_ != nullptr) {
- RecordTick(statistics_, ticker_type_, duration);
- }
- start_ = 0;
- }
- }
- private:
- const bool perf_counter_enabled_;
- const bool use_cpu_time_;
- Env* const env_;
- uint64_t start_;
- uint64_t* metric_;
- Statistics* statistics_;
- uint32_t ticker_type_;
- };
- } // namespace ROCKSDB_NAMESPACE
|