| // 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 { |
| |
| class PerfStepTimer { |
| public: |
| explicit PerfStepTimer(uint64_t* metric, bool for_mutex = false) |
| : enabled_(perf_level >= PerfLevel::kEnableTime || |
| (!for_mutex && perf_level >= kEnableTimeExceptForMutex)), |
| env_(enabled_ ? Env::Default() : nullptr), |
| start_(0), |
| metric_(metric) {} |
| |
| ~PerfStepTimer() { |
| Stop(); |
| } |
| |
| void Start() { |
| if (enabled_) { |
| start_ = env_->NowNanos(); |
| } |
| } |
| |
| void Measure() { |
| if (start_) { |
| uint64_t now = env_->NowNanos(); |
| *metric_ += now - start_; |
| start_ = now; |
| } |
| } |
| |
| void Stop() { |
| if (start_) { |
| *metric_ += env_->NowNanos() - start_; |
| start_ = 0; |
| } |
| } |
| |
| private: |
| const bool enabled_; |
| Env* const env_; |
| uint64_t start_; |
| uint64_t* metric_; |
| }; |
| |
| } // namespace rocksdb |