1#ifndef CRYPTOPP_HRTIMER_H 2#define CRYPTOPP_HRTIMER_H 3 4#include "config.h" 5#ifndef HIGHRES_TIMER_AVAILABLE 6#include <time.h> 7#endif 8 9NAMESPACE_BEGIN(CryptoPP) 10 11#ifdef HIGHRES_TIMER_AVAILABLE 12 typedef word64 TimerWord; 13#else 14 typedef clock_t TimerWord; 15#endif 16 17//! _ 18class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE TimerBase 19{ 20public: 21 enum Unit {SECONDS = 0, MILLISECONDS, MICROSECONDS, NANOSECONDS}; 22 TimerBase(Unit unit, bool stuckAtZero) : m_timerUnit(unit), m_stuckAtZero(stuckAtZero), m_started(false) {} 23 24 virtual TimerWord GetCurrentTimerValue() =0; // GetCurrentTime is a macro in MSVC 6.0 25 virtual TimerWord TicksPerSecond() =0; // this is not the resolution, just a conversion factor into seconds 26 27 void StartTimer(); 28 double ElapsedTimeAsDouble(); 29 unsigned long ElapsedTime(); 30 31private: 32 double ConvertTo(TimerWord t, Unit unit); 33 34 Unit m_timerUnit; // HPUX workaround: m_unit is a system macro on HPUX 35 bool m_stuckAtZero, m_started; 36 TimerWord m_start, m_last; 37}; 38 39//! measure CPU time spent executing instructions of this thread (if supported by OS) 40/*! /note This only works correctly on Windows NT or later. On Unix it reports process time, and others wall clock time. 41*/ 42class ThreadUserTimer : public TimerBase 43{ 44public: 45 ThreadUserTimer(Unit unit = TimerBase::SECONDS, bool stuckAtZero = false) : TimerBase(unit, stuckAtZero) {} 46 TimerWord GetCurrentTimerValue(); 47 TimerWord TicksPerSecond(); 48}; 49 50//! high resolution timer 51class CRYPTOPP_DLL Timer : public TimerBase 52{ 53public: 54 Timer(Unit unit = TimerBase::SECONDS, bool stuckAtZero = false) : TimerBase(unit, stuckAtZero) {} 55 TimerWord GetCurrentTimerValue(); 56 TimerWord TicksPerSecond(); 57}; 58 59NAMESPACE_END 60 61#endif 62