stop_watch.h 1.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
#ifndef STORAGE_LEVELDB_UTIL_STOP_WATCH_H_
#define STORAGE_LEVELDB_UTIL_STOP_WATCH_H_

#include "leveldb/env.h"
#include "leveldb/statistics.h"
#include <iostream>
namespace leveldb {

class StopWatch {
 public:
  virtual uint64_t ElapsedMicros() = 0;
  virtual ~StopWatch() {}
};

class DoNothingStopWatch : public StopWatch {
 public:
  virtual uint64_t ElapsedMicros() {
    return 0;
  }
};

// Auto-scoped.
// Records the statistic into the corresponding histogram.
class ScopedRecordingStopWatch : public StopWatch {
 public:
  ScopedRecordingStopWatch(Env * const env,
A
Abhishek Kona 已提交
27
                           std::shared_ptr<Statistics> statistics,
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
                           const Histograms histogram_name) :
                            env_(env),
                            start_time_(env->NowMicros()),
                            statistics_(statistics),
                            histogram_name_(histogram_name) {}

  virtual uint64_t ElapsedMicros() {
    return env_->NowMicros() - start_time_;
  }

  virtual ~ScopedRecordingStopWatch() {
    uint64_t elapsed_time = env_->NowMicros() - start_time_;
    statistics_->measureTime(histogram_name_, elapsed_time);
  }

 private:
  Env* const env_;
  const uint64_t start_time_;
A
Abhishek Kona 已提交
46
  std::shared_ptr<Statistics> statistics_;
47 48 49 50 51 52 53
  const Histograms histogram_name_;

};

namespace stats {
// Helper method
std::unique_ptr<StopWatch> StartStopWatch(Env * const env,
A
Abhishek Kona 已提交
54
                                          std::shared_ptr<Statistics> stats,
55 56
                                          Histograms histogram_name) {
  assert(env);
A
Abhishek Kona 已提交
57
  if (stats) {
58 59
    return std::unique_ptr<StopWatch>(new ScopedRecordingStopWatch(
                                           env,
A
Abhishek Kona 已提交
60
                                           stats,
61 62 63 64 65 66 67 68
                                           histogram_name));
  } else {
    return std::unique_ptr<StopWatch>(new DoNothingStopWatch());
  }
};
} // namespace stats
} // namespace leveldb
#endif // STORAGE_LEVELDB_UTIL_STOP_WATCH_H_