| // 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/statistics.h" |
| #include "rocksdb/env.h" |
| |
| namespace rocksdb { |
| // Auto-scoped. |
| // Records the measure time into the corresponding histogram if statistics |
| // is not nullptr. It is also saved into *elapsed if the pointer is not nullptr |
| // and overwrite is true, it will be added to *elapsed if overwrite is false. |
| class StopWatch { |
| public: |
| StopWatch(Env* const env, Statistics* statistics, const uint32_t hist_type, |
| uint64_t* elapsed = nullptr, bool overwrite = true) |
| : env_(env), |
| statistics_(statistics), |
| hist_type_(hist_type), |
| elapsed_(elapsed), |
| overwrite_(overwrite), |
| stats_enabled_(statistics && statistics->HistEnabledForType(hist_type)), |
| start_time_((stats_enabled_ || elapsed != nullptr) ? env->NowMicros() |
| : 0) {} |
| |
| ~StopWatch() { |
| if (elapsed_) { |
| if (overwrite_) { |
| *elapsed_ = env_->NowMicros() - start_time_; |
| } else { |
| *elapsed_ += env_->NowMicros() - start_time_; |
| } |
| } |
| if (stats_enabled_) { |
| statistics_->measureTime(hist_type_, |
| (elapsed_ != nullptr) ? *elapsed_ : |
| (env_->NowMicros() - start_time_)); |
| } |
| } |
| |
| uint64_t start_time() const { return start_time_; } |
| |
| private: |
| Env* const env_; |
| Statistics* statistics_; |
| const uint32_t hist_type_; |
| uint64_t* elapsed_; |
| bool overwrite_; |
| bool stats_enabled_; |
| const uint64_t start_time_; |
| }; |
| |
| // a nano second precision stopwatch |
| class StopWatchNano { |
| public: |
| explicit StopWatchNano(Env* const env, bool auto_start = false) |
| : env_(env), start_(0) { |
| if (auto_start) { |
| Start(); |
| } |
| } |
| |
| void Start() { start_ = env_->NowNanos(); } |
| |
| uint64_t ElapsedNanos(bool reset = false) { |
| auto now = env_->NowNanos(); |
| auto elapsed = now - start_; |
| if (reset) { |
| start_ = now; |
| } |
| return elapsed; |
| } |
| |
| uint64_t ElapsedNanosSafe(bool reset = false) { |
| return (env_ != nullptr) ? ElapsedNanos(reset) : 0U; |
| } |
| |
| private: |
| Env* const env_; |
| uint64_t start_; |
| }; |
| |
| } // namespace rocksdb |