00001
00002
00003
00004
00005
00006
00007
00008 #include "ibrcommon/TimeMeasurement.h"
00009 #include <iostream>
00010 #include <iomanip>
00011
00012
00013 namespace ibrcommon
00014 {
00015 TimeMeasurement::TimeMeasurement()
00016 {
00017 start(); stop();
00018 }
00019
00020 TimeMeasurement::~TimeMeasurement()
00021 {
00022 }
00023
00024 void TimeMeasurement::start()
00025 {
00026
00027 clock_gettime(CLOCK_MONOTONIC, &_start);
00028 }
00029
00030 void TimeMeasurement::stop()
00031 {
00032
00033
00034
00035 clock_gettime(CLOCK_MONOTONIC, &_end);
00036 }
00037
00038 float TimeMeasurement::getMilliseconds()
00039 {
00040
00041 u_int64_t timeElapsed = TimeMeasurement::timespecDiff(&_end, &_start);
00042
00043
00044 float delay_ms = (float)timeElapsed / 1000000;
00045
00046 return delay_ms;
00047 }
00048
00049 float TimeMeasurement::getSeconds()
00050 {
00051 return getMilliseconds() / 1000;
00052 }
00053
00054 std::ostream &operator<<(std::ostream &stream, TimeMeasurement &measurement)
00055 {
00056
00057 u_int64_t timeElapsed = TimeMeasurement::timespecDiff(&(measurement._end), &(measurement._start));
00058
00059
00060 float delay_ms = (float)timeElapsed / 1000000;
00061 float delay_sec = delay_ms / 1000;
00062 float delay_min = delay_sec / 60;
00063 float delay_h = delay_min / 60;
00064
00065 if (delay_h > 1)
00066 {
00067 stream << std::setiosflags(std::ios::fixed) << std::setprecision(2) << delay_h << " h";
00068 }
00069 else if (delay_min > 1)
00070 {
00071 stream << std::setiosflags(std::ios::fixed) << std::setprecision(2) << delay_min << " m";
00072 }
00073 else if (delay_sec > 1)
00074 {
00075 stream << std::setiosflags(std::ios::fixed) << std::setprecision(2) << delay_sec << " s.";
00076 }
00077 else
00078 {
00079 stream << std::setiosflags(std::ios::fixed) << std::setprecision(2) << delay_ms << " ms";
00080 }
00081
00082 return stream;
00083 }
00084
00085 int64_t TimeMeasurement::timespecDiff(struct timespec *timeA_p, struct timespec *timeB_p)
00086 {
00087 return ((timeA_p->tv_sec * 1000000000) + timeA_p->tv_nsec) -
00088 ((timeB_p->tv_sec * 1000000000) + timeB_p->tv_nsec);
00089 }
00090 }