|
IBR-DTNSuite 0.6
|
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 }