31#include "iceberg/iceberg_export.h"
47ICEBERG_EXPORT
constexpr std::string_view ToString(TimerUnit unit)
noexcept {
49 case TimerUnit::kNanoseconds:
51 case TimerUnit::kMicroseconds:
52 return "microseconds";
53 case TimerUnit::kMilliseconds:
54 return "milliseconds";
55 case TimerUnit::kSeconds:
57 case TimerUnit::kMinutes:
59 case TimerUnit::kHours:
61 case TimerUnit::kDays:
91 std::chrono::steady_clock::time_point start_;
92 bool stopped_ =
false;
95 virtual ~Timer() =
default;
98 virtual int64_t
Count()
const = 0;
107 virtual void Record(std::chrono::nanoseconds duration) = 0;
110 template <
typename Rep,
typename Period>
111 void Record(std::chrono::duration<Rep, Period> duration) {
112 Record(std::chrono::duration_cast<std::chrono::nanoseconds>(duration));
116 virtual std::string_view
Unit()
const {
return "nanoseconds"; }
119 virtual bool IsNoop()
const {
return false; }
129 template <
typename Callable>
130 decltype(
auto)
Time(Callable&& fn) {
131 auto timed = Start();
132 using ResultType = std::invoke_result_t<Callable&&>;
133 if constexpr (std::is_void_v<ResultType>) {
134 std::invoke(std::forward<Callable>(fn));
135 }
else if constexpr (std::is_reference_v<ResultType>) {
136 return std::invoke(std::forward<Callable>(fn));
138 return std::invoke(std::forward<Callable>(fn));
143 static std::shared_ptr<Timer> Noop();
149 explicit DefaultTimer(TimerUnit unit = TimerUnit::kNanoseconds);
151 int64_t Count()
const override;
152 std::chrono::nanoseconds TotalDuration()
const override;
153 void Record(std::chrono::nanoseconds duration)
override;
154 std::string_view
Unit()
const override {
return ToString(unit_); }
157 std::atomic<int64_t> count_{0};
158 std::atomic<int64_t> total_nanos_{0};
Thread-safe timer backed by std::atomic<int64_t>.
Definition timer.h:147
std::string_view Unit() const override
Return the time unit used by this timer.
Definition timer.h:154
RAII guard that records elapsed time into a non-owning Timer on destruction.
Definition timer.h:74
Abstract timer for measuring operation durations.
Definition timer.h:71
decltype(auto) Time(Callable &&fn)
Execute a callable, record its wall-clock duration, and return its result.
Definition timer.h:130
virtual int64_t Count() const =0
Number of timing recordings made so far.
void Record(std::chrono::duration< Rep, Period > duration)
Record a duration of any chrono type, converting to nanoseconds.
Definition timer.h:111
virtual std::string_view Unit() const
Return the time unit used by this timer.
Definition timer.h:116
virtual bool IsNoop() const
Return true if this timer is a no-op.
Definition timer.h:119
virtual std::chrono::nanoseconds TotalDuration() const =0
Total accumulated duration across all recordings.
virtual void Record(std::chrono::nanoseconds duration)=0
Record a nanosecond duration directly.