[RocksDB] Simplify StopWatch implementation
Summary: Make stop watch a simple implementation, instead of subclass of a virtual class Allocate stop watches off the stack instead of heap. Code is more terse now. Test Plan: make all check, db_bench with --statistics=1 Reviewers: haobo, dhruba Reviewed By: haobo CC: leveldb Differential Revision: https://reviews.facebook.net/D10809
This commit is contained in:
parent
446151cd20
commit
e1174306c5
@ -1930,9 +1930,7 @@ Status DBImpl::Get(const ReadOptions& options,
|
||||
std::string* value) {
|
||||
Status s;
|
||||
|
||||
std::unique_ptr<StopWatch> sw = stats::StartStopWatch(env_,
|
||||
options_.statistics,
|
||||
DB_GET);
|
||||
StopWatch sw(env_, options_.statistics, DB_GET);
|
||||
SequenceNumber snapshot;
|
||||
MutexLock l(&mutex_);
|
||||
if (options.snapshot != nullptr) {
|
||||
@ -2025,9 +2023,7 @@ Status DBImpl::Write(const WriteOptions& options, WriteBatch* my_batch) {
|
||||
w.disableWAL = options.disableWAL;
|
||||
w.done = false;
|
||||
|
||||
std::unique_ptr<StopWatch> sw = stats::StartStopWatch(env_,
|
||||
options_.statistics,
|
||||
DB_WRITE);
|
||||
StopWatch sw(env_, options_.statistics, DB_WRITE);
|
||||
MutexLock l(&mutex_);
|
||||
writers_.push_back(&w);
|
||||
while (!w.done && &w != writers_.front()) {
|
||||
|
@ -3,41 +3,31 @@
|
||||
|
||||
#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 {
|
||||
class StopWatch {
|
||||
public:
|
||||
ScopedRecordingStopWatch(Env * const env,
|
||||
std::shared_ptr<Statistics> statistics,
|
||||
const Histograms histogram_name) :
|
||||
env_(env),
|
||||
start_time_(env->NowMicros()),
|
||||
statistics_(statistics),
|
||||
histogram_name_(histogram_name) {}
|
||||
StopWatch(
|
||||
Env * const env,
|
||||
std::shared_ptr<Statistics> statistics,
|
||||
const Histograms histogram_name) :
|
||||
env_(env),
|
||||
start_time_(env->NowMicros()),
|
||||
statistics_(statistics),
|
||||
histogram_name_(histogram_name) {}
|
||||
|
||||
virtual uint64_t ElapsedMicros() {
|
||||
|
||||
|
||||
uint64_t ElapsedMicros() {
|
||||
return env_->NowMicros() - start_time_;
|
||||
}
|
||||
|
||||
virtual ~ScopedRecordingStopWatch() {
|
||||
uint64_t elapsed_time = env_->NowMicros() - start_time_;
|
||||
statistics_->measureTime(histogram_name_, elapsed_time);
|
||||
~StopWatch() {
|
||||
if (statistics_) {
|
||||
statistics_->measureTime(histogram_name_, ElapsedMicros());
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
@ -47,22 +37,5 @@ class ScopedRecordingStopWatch : public StopWatch {
|
||||
const Histograms histogram_name_;
|
||||
|
||||
};
|
||||
|
||||
namespace stats {
|
||||
// Helper method
|
||||
std::unique_ptr<StopWatch> StartStopWatch(Env * const env,
|
||||
std::shared_ptr<Statistics> stats,
|
||||
Histograms histogram_name) {
|
||||
assert(env);
|
||||
if (stats) {
|
||||
return std::unique_ptr<StopWatch>(new ScopedRecordingStopWatch(
|
||||
env,
|
||||
stats,
|
||||
histogram_name));
|
||||
} else {
|
||||
return std::unique_ptr<StopWatch>(new DoNothingStopWatch());
|
||||
}
|
||||
};
|
||||
} // namespace stats
|
||||
} // namespace leveldb
|
||||
#endif // STORAGE_LEVELDB_UTIL_STOP_WATCH_H_
|
||||
|
Loading…
Reference in New Issue
Block a user