Changeset ca940b for src


Ignore:
Timestamp:
Jul 14, 2014, 8:37:03 PM (11 years ago)
Author:
Frederik Heber <heber@…>
Children:
ef9dff6
Parents:
e93bfe
git-author:
Frederik Heber <heber@…> (06/18/14 08:14:25)
git-committer:
Frederik Heber <heber@…> (07/14/14 20:37:03)
Message:

FIX: Chronos is now working correctly, no more negative times.

  • extracted difference calculator into static function, making it thus accessible to unit testing.
  • kudos to Saskia Metzler for inspiring the test.
Location:
src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • src/CodePatterns/Chronos.hpp

    re93bfe rca940b  
    9595  double getCurrentTime() const;
    9696
     97  typedef std::pair<size_t, size_t> sec_ncsec_t;
     98
     99  /** Returns the correct difference between split tuples (sec, nsec).
     100   *
     101   * \param _time1 first tuple
     102   * \param _time2 second tuple
     103   */
     104  static
     105  double calculateCorrectTimeDifference(
     106                const sec_ncsec_t &_time1,
     107      const sec_ncsec_t &_time2);
     108
    97109  //!> typedef for the map storing status of time keeping per token
    98110  typedef std::map<const std::string, double> TimerMap;
  • src/Helpers/Chronos.cpp

    re93bfe rca940b  
    102102}
    103103
     104double Chronos::calculateCorrectTimeDifference(
     105    const sec_ncsec_t &_time1,
     106    const sec_ncsec_t &_time2)
     107{
     108        double currenttime = 0.;
     109  if (_time1.second < _time2.second)
     110                currenttime = (_time1.first - _time2.first - 1)
     111                        + (1e9 + _time1.second - _time2.second) * 1.e-9;
     112  else
     113                currenttime = (_time1.first - _time2.first)
     114                        + (_time1.second - _time2.second) * 1.e-9;
     115  return currenttime;
     116}
     117
    104118double Chronos::getCurrentTime() const
    105119{
     
    108122  timespec time1;
    109123  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
    110   double currenttime;
    111   if (time1.tv_nsec < basetime.tv_nsec)
    112     currenttime = (time1.tv_sec - basetime.tv_sec - 1)
    113         + (basetime.tv_nsec - time1.tv_nsec) * 1.e-9;
    114   else
    115     currenttime = (time1.tv_sec - basetime.tv_sec)
    116         + (time1.tv_nsec - basetime.tv_nsec) * 1.e-9;
     124  double currenttime = calculateCorrectTimeDifference(
     125                  std::make_pair( time1.tv_sec, time1.tv_nsec),
     126                  std::make_pair( basetime.tv_sec, basetime.tv_nsec)
     127                  );
    117128#else
    118129#ifdef HAVE_SYS_TIME_H
     
    121132  // gettimeofday gives microseconds accuracy
    122133  gettimeofday(&time1, &timezone1);
    123   double currenttime;
    124   if (time1.tv_usec < basetime.tv_usec)
    125     currenttime = (time1.tv_sec - basetime.tv_sec - 1)
    126         + (basetime.tv_usec - time1.tv_usec) * 1.e-6;
    127   else
    128     currenttime = (time1.tv_sec - basetime.tv_sec)
    129         + (time1.tv_usec - basetime.tv_usec) * 1.e-6;
     134  double currenttime = calculateCorrectTimeDifference(
     135      std::make_pair( time1.tv_sec, time1.tv_usec),
     136                  std::make_pair( basetime.tv_sec, basetime.tv_usec)
     137                  );
    130138#else
    131139#ifdef HAVE_SYS_TIMES_H
    132140  // clock is only accurate up to milliseconds
    133141  struct tms *buffer = new tms;
    134   double currenttime;
    135142  if (times(buffer) != (clock_t)(-1))
    136143    currenttime =
  • src/Helpers/unittests/ChronosUnitTest.cpp

    re93bfe rca940b  
    152152  std::cout << Chronos::getInstance() << std::endl;
    153153}
     154
     155/**
     156 * UnitTest for Chronos::calculateCorrectTimeDifference()
     157 */
     158void ChronosTest::calculateCorrectTimeDifferenceTest()
     159{
     160  Chronos::sec_ncsec_t first;
     161  Chronos::sec_ncsec_t second;
     162        {
     163                // 1.1 - 0.01
     164                first.first = 1;
     165                first.second = 1e8;
     166                second.first = 0;
     167                second.second = 1e7;
     168                double difference = Chronos::calculateCorrectTimeDifference(first, second);
     169    CPPUNIT_ASSERT( fabs(1.1-0.01 - difference) < std::numeric_limits<double>::epsilon()*1e2);
     170//              CPPUNIT_ASSERT_EQUAL( 1.1-0.01, difference);
     171        }
     172        {
     173                // 1.1 - 0.9
     174                first.first = 1;
     175                first.second = 1e8;
     176                second.first = 0;
     177                second.second = 9e8;
     178                double difference = Chronos::calculateCorrectTimeDifference(first, second);
     179                //    CPPUNIT_ASSERT_EQUAL( 1.1-0.9, difference);
     180                CPPUNIT_ASSERT( fabs(1.1-0.9 - difference) < std::numeric_limits<double>::epsilon()*1e2);
     181        }
     182        {
     183                // 1000.1 - 0.9
     184                first.first = 1000;
     185                first.second = 1e8;
     186                second.first = 0;
     187                second.second = 9e8;
     188                double difference = Chronos::calculateCorrectTimeDifference(first, second);
     189//              CPPUNIT_ASSERT_EQUAL( 1000.1-0.9, difference);
     190    CPPUNIT_ASSERT( fabs(1000.1-0.9 - difference) < std::numeric_limits<double>::epsilon()*1e2);
     191        }
     192}
  • src/Helpers/unittests/ChronosUnitTest.hpp

    re93bfe rca940b  
    2121    CPPUNIT_TEST ( InstanceTest );
    2222    CPPUNIT_TEST ( dummyTest );
     23    CPPUNIT_TEST ( calculateCorrectTimeDifferenceTest );
    2324    CPPUNIT_TEST_SUITE_END();
    2425
     
    2930    void InstanceTest();
    3031    void dummyTest();
     32    void calculateCorrectTimeDifferenceTest();
    3133};
    3234
Note: See TracChangeset for help on using the changeset viewer.