Files
scylladb/utils/latency.hh
Glauber Costa 93386bcec7 histograms: do not use latency_in_nano
Now that the histogram has its own unit expressed in its template
parameter, there is no reason to convert it to nano just so we may need
to convert it back if the histogram needs another unit.

This patch will keep everything as a duration until last moment, and
then we'll convert when needed.

This was suggested by Amnon.

Signed-off-by: Glauber Costa <glauber@scylladb.com>
Message-Id: <218efa83e1c4ddc6806c51913d4e5f82dc6d231e.1479139020.git.glauber@scylladb.com>
2016-11-14 18:01:43 +02:00

74 lines
1.7 KiB
C++

/*
* Copyright (C) 2015 ScyllaDB
*/
/*
* This file is part of Scylla.
*
* Scylla is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Scylla is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Scylla. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <chrono>
/**
* A helper class to keep track of latencies
*/
namespace utils {
class latency_counter {
public:
using clock = std::chrono::steady_clock;
using time_point = clock::time_point;
using duration = clock::duration;
private:
time_point _start;
time_point _stop;
public:
void start() {
_start = now();
}
bool is_start() const {
// if start is not set it is still zero
return _start.time_since_epoch().count();
}
latency_counter& stop() {
_stop = now();
return *this;
}
bool is_stopped() const {
// if stop was not set, it is still zero
return _stop.time_since_epoch().count();
}
duration latency() const {
return _stop - _start;
}
latency_counter& check_and_stop() {
if (!is_stopped()) {
return stop();
}
return *this;
}
static time_point now() {
return clock::now();
}
};
}