IBR-DTNSuite 0.6

ibrcommon/ibrcommon/TimeMeasurement.cpp

Go to the documentation of this file.
00001 /*
00002  * TimeMeasurement.cpp
00003  *
00004  *  Created on: 20.01.2010
00005  *      Author: morgenro
00006  */
00007 
00008 #include "ibrcommon/TimeMeasurement.h"
00009 #include <iostream>
00010 #include <iomanip>
00011 #include <features.h>
00012 #include <stdio.h>
00013 
00014 namespace ibrcommon
00015 {
00016         TimeMeasurement::TimeMeasurement()
00017         {
00018                 start(); stop();
00019         }
00020 
00021         TimeMeasurement::~TimeMeasurement()
00022         {
00023         }
00024 
00025         void TimeMeasurement::start()
00026         {
00027                 // set sending time
00028                 clock_gettime(CLOCK_MONOTONIC, &_start);
00029         }
00030 
00031         void TimeMeasurement::stop()
00032         {
00033                 //We are DOOOOMED
00034                 //http://www.wand.net.nz/~smr26/wordpress/2009/01/19/monotonic-time-in-mac-os-x/
00035                 // set receiving time
00036                 clock_gettime(CLOCK_MONOTONIC, &_end);
00037         }
00038 
00039         float TimeMeasurement::getMilliseconds()
00040         {
00041                 // calc difference
00042                 u_int64_t timeElapsed = TimeMeasurement::timespecDiff(&_end, &_start);
00043 
00044                 // make it readable
00045                 float delay_ms = (float)timeElapsed / 1000000;
00046 
00047                 return delay_ms;
00048         }
00049 
00050         float TimeMeasurement::getNanoseconds()
00051         {
00052                 // calc difference
00053                 return TimeMeasurement::timespecDiff(&_end, &_start);
00054         }
00055 
00056         float TimeMeasurement::getMicroseconds()
00057         {
00058                 // calc difference
00059                 u_int64_t timeElapsed = TimeMeasurement::timespecDiff(&_end, &_start);
00060 
00061                 // make it readable
00062                 float delay_m = (float)timeElapsed / 1000;
00063 
00064                 return delay_m;
00065         }
00066 
00067         float TimeMeasurement::getSeconds()
00068         {
00069                 return getMilliseconds() / 1000;
00070         }
00071 
00072         std::ostream& TimeMeasurement::format(std::ostream &stream, const float value)
00073         {
00074 #ifdef __UCLIBC__
00075                 char buf[32];
00076                 snprintf(buf, 32, "%4.2f", value);
00077                 stream << std::string(buf);
00078 #else
00079                 stream << std::setiosflags(std::ios::fixed) << std::setprecision(2) << value;
00080 #endif
00081                 return stream;
00082         }
00083 
00084         std::ostream &operator<<(std::ostream &stream, TimeMeasurement &measurement)
00085         {
00086                 // calc difference
00087                 u_int64_t timeElapsed = TimeMeasurement::timespecDiff(&(measurement._end), &(measurement._start));
00088 
00089                 // make it readable
00090                 float delay_ms = (float)timeElapsed / 1000000;
00091                 float delay_sec = delay_ms / 1000;
00092                 float delay_min = delay_sec / 60;
00093                 float delay_h = delay_min / 60;
00094 
00095                 if (delay_h > 1)
00096                 {
00097                         TimeMeasurement::format(stream, delay_h); stream << " h";
00098                 }
00099                 else if (delay_min > 1)
00100                 {
00101                         TimeMeasurement::format(stream, delay_min); stream << " m";
00102                 }
00103                 else if (delay_sec > 1)
00104                 {
00105                         TimeMeasurement::format(stream, delay_sec); stream << " s";
00106                 }
00107                 else
00108                 {
00109                         TimeMeasurement::format(stream, delay_ms); stream << " ms";
00110                 }
00111 
00112                 return stream;
00113         }
00114 
00115         int64_t TimeMeasurement::timespecDiff(struct timespec *timeA_p, struct timespec *timeB_p)
00116         {
00117                 //Casting to 64Bit, otherwise it caps out at ~ 5 secs for 32bit machines
00118                return (   (  (int64_t)(timeA_p->tv_sec) * 1e9 + (int64_t)(timeA_p->tv_nsec)) -  ( (int64_t)(timeB_p->tv_sec) * 1e9 + (int64_t)(timeB_p->tv_nsec)) );
00119         }
00120 }