artdaq_core  v3_06_11
TimeUtils_t.cc
1 #include "artdaq-core/Utilities/TimeUtils.hh"
2 
3 #define BOOST_TEST_MODULE TimeUtils_t
4 #include <cmath>
5 #include "cetlib/quiet_unit_test.hpp"
6 #include "cetlib_except/exception.h"
7 
8 #define TRACE_NAME "TimeUtils_t"
9 #include "tracemf.h"
10 
11 BOOST_AUTO_TEST_SUITE(TimeUtils_test)
12 
13 BOOST_AUTO_TEST_CASE(GetElapsedTime)
14 {
15  auto then = std::chrono::steady_clock::now();
16  auto now = then + std::chrono::seconds(1);
17 
18  BOOST_REQUIRE_EQUAL(artdaq::TimeUtils::GetElapsedTime(then, now), 1);
19  BOOST_REQUIRE_EQUAL(artdaq::TimeUtils::GetElapsedTimeMilliseconds(then, now), 1000);
20  BOOST_REQUIRE_EQUAL(artdaq::TimeUtils::GetElapsedTimeMicroseconds(then, now), 1000000);
21 
22  auto start = std::chrono::steady_clock::now();
23  for (int ii = 0; ii < 1000000; ++ii)
24  {
26  }
27  auto dur = artdaq::TimeUtils::GetElapsedTime(start);
28  TLOG(TLVL_INFO) << "Time to call GetElapsedTime 1000000 times: " << dur << " s ( ave: " << dur / 1000000 << " s/call ).";
29  start = std::chrono::steady_clock::now();
30  for (int ii = 0; ii < 1000000; ++ii)
31  {
33  }
35  TLOG(TLVL_INFO) << "Time to call GetElapsedTimeMilliseconds 1000000 times: " << dur << " s ( ave: " << dur / 1000000 << " s/call ).";
36  start = std::chrono::steady_clock::now();
37  for (int ii = 0; ii < 1000000; ++ii)
38  {
40  }
42  TLOG(TLVL_INFO) << "Time to call GetElapsedTimeMicroseconds 1000000 times: " << dur << " s ( ave: " << dur / 1000000 << " s/call ).";
43 }
44 
45 BOOST_AUTO_TEST_CASE(UnixTime)
46 {
47  time_t t = time(0);
48  struct timeval tv;
49  gettimeofday(&tv, nullptr);
50  struct timespec ts = artdaq::TimeUtils::get_realtime_clock();
51 
52  auto timeString = artdaq::TimeUtils::convertUnixTimeToString(t);
53  TLOG(TLVL_INFO) << "time_t to string: " << timeString;
55  TLOG(TLVL_INFO) << "time_t to seconds: " << timeDouble;
56 
57  auto valString = artdaq::TimeUtils::convertUnixTimeToString(tv);
58  TLOG(TLVL_INFO) << "timeval to string: " << valString;
60  TLOG(TLVL_INFO) << "timeval to seconds: " << valDouble;
61 
62  auto specString = artdaq::TimeUtils::convertUnixTimeToString(ts);
63  TLOG(TLVL_INFO) << "timespec to string: " << specString;
64  auto specDouble = artdaq::TimeUtils::convertUnixTimeToSeconds(ts);
65  TLOG(TLVL_INFO) << "timespec to seconds: " << specDouble;
66 
67  BOOST_REQUIRE_EQUAL(timeDouble, std::floor(valDouble));
68  BOOST_REQUIRE_EQUAL(timeDouble, std::floor(specDouble));
69 }
70 
71 BOOST_AUTO_TEST_CASE(GetTimeOfDayUS)
72 {
74  struct timespec ts = artdaq::TimeUtils::get_realtime_clock();
75  BOOST_REQUIRE_EQUAL(now / 1000000, ts.tv_sec);
76 }
77 
78 BOOST_AUTO_TEST_SUITE_END()
double GetElapsedTime(std::chrono::steady_clock::time_point then, std::chrono::steady_clock::time_point now=std::chrono::steady_clock::now())
Get the number of seconds in the given interval
Definition: TimeUtils.hh:30
size_t GetElapsedTimeMicroseconds(std::chrono::steady_clock::time_point then, std::chrono::steady_clock::time_point now=std::chrono::steady_clock::now())
Gets the number of microseconds in the given time interval
Definition: TimeUtils.hh:41
struct timespec get_realtime_clock()
Get the current time of day as a pair of seconds and nanoseconds (from clock_gettime(CLOCK_REALTIME, ...) system call)
Definition: TimeUtils.cc:58
double convertUnixTimeToSeconds(time_t inputUnixTime)
Converts a Unix time to double.
Definition: TimeUtils.cc:66
size_t GetElapsedTimeMilliseconds(std::chrono::steady_clock::time_point then, std::chrono::steady_clock::time_point now=std::chrono::steady_clock::now())
Gets the number of milliseconds in the given time interval
Definition: TimeUtils.hh:52
std::string convertUnixTimeToString(time_t inputUnixTime)
Converts a Unix time to its string representation, in UTC.
Definition: TimeUtils.cc:7
uint64_t gettimeofday_us()
Get the current time of day in microseconds (from gettimeofday system call)
Definition: TimeUtils.cc:51