epee: add nanosecond timer and pause/restart profiling macros

Nanosecond timer precision won't work on Windows, but we don't
care since I'm using that just for profiling incremental code
paths, but a Windows coder is welcome to add it if there's a way.
This commit is contained in:
moneromooo-monero 2017-08-01 14:03:18 +01:00
parent ab594cfee9
commit bda8c5983b
No known key found for this signature in database
GPG Key ID: 686F07454D6CEFC3
2 changed files with 17 additions and 5 deletions

View File

@ -48,17 +48,17 @@ namespace epee
namespace misc_utils namespace misc_utils
{ {
inline uint64_t get_tick_count() inline uint64_t get_ns_count()
{ {
#if defined(_MSC_VER) #if defined(_MSC_VER)
return ::GetTickCount64(); return ::GetTickCount64() * 1000000;
#elif defined(WIN32) #elif defined(WIN32)
static LARGE_INTEGER pcfreq = {0}; static LARGE_INTEGER pcfreq = {0};
LARGE_INTEGER ticks; LARGE_INTEGER ticks;
if (!pcfreq.QuadPart) if (!pcfreq.QuadPart)
QueryPerformanceFrequency(&pcfreq); QueryPerformanceFrequency(&pcfreq);
QueryPerformanceCounter(&ticks); QueryPerformanceCounter(&ticks);
ticks.QuadPart *= 1000; /* we want msec */ ticks.QuadPart *= 1000000000; /* we want nsec */
return ticks.QuadPart / pcfreq.QuadPart; return ticks.QuadPart / pcfreq.QuadPart;
#elif defined(__MACH__) #elif defined(__MACH__)
clock_serv_t cclock; clock_serv_t cclock;
@ -68,16 +68,21 @@ namespace misc_utils
clock_get_time(cclock, &mts); clock_get_time(cclock, &mts);
mach_port_deallocate(mach_task_self(), cclock); mach_port_deallocate(mach_task_self(), cclock);
return (mts.tv_sec * 1000) + (mts.tv_nsec/1000000); return (mts.tv_sec * 1000000000) + (mts.tv_nsec);
#else #else
struct timespec ts; struct timespec ts;
if(clock_gettime(CLOCK_MONOTONIC, &ts) != 0) { if(clock_gettime(CLOCK_MONOTONIC, &ts) != 0) {
return 0; return 0;
} }
return (ts.tv_sec * 1000) + (ts.tv_nsec/1000000); return (ts.tv_sec * 1000000000) + (ts.tv_nsec);
#endif #endif
} }
inline uint64_t get_tick_count()
{
return get_ns_count() / 1000000;
}
inline int call_sys_cmd(const std::string& cmd) inline int call_sys_cmd(const std::string& cmd)
{ {

View File

@ -57,8 +57,15 @@ namespace epee
#define TIME_MEASURE_START(var_name) uint64_t var_name = epee::misc_utils::get_tick_count(); #define TIME_MEASURE_START(var_name) uint64_t var_name = epee::misc_utils::get_tick_count();
#define TIME_MEASURE_PAUSE(var_name) var_name = epee::misc_utils::get_tick_count() - var_name;
#define TIME_MEASURE_RESTART(var_name) var_name = epee::misc_utils::get_tick_count() - var_name;
#define TIME_MEASURE_FINISH(var_name) var_name = epee::misc_utils::get_tick_count() - var_name; #define TIME_MEASURE_FINISH(var_name) var_name = epee::misc_utils::get_tick_count() - var_name;
#define TIME_MEASURE_NS_START(var_name) uint64_t var_name = epee::misc_utils::get_ns_count();
#define TIME_MEASURE_NS_PAUSE(var_name) var_name = epee::misc_utils::get_ns_count() - var_name;
#define TIME_MEASURE_NS_RESTART(var_name) var_name = epee::misc_utils::get_ns_count() - var_name;
#define TIME_MEASURE_NS_FINISH(var_name) var_name = epee::misc_utils::get_ns_count() - var_name;
namespace profile_tools namespace profile_tools
{ {
struct local_call_account struct local_call_account