Exemples C++ -- Chrono

Les fragments ci-dessous sont extraits de ut_tools.h et system_clock_ut.cpp, fichiers sources des tests unitaires de ASRI.

La classe Chrono inline permet de mesurer facilement le temps qui passe:

  • le constructeur obtient l'heure système, avec une précision d'environ 10 millisecondes
  • la méthode elapsed() retourne la différence entre l'heure courante et l'heure de démarrage du Chrono
  • la classe est écrite en utilisant et respectant les conventions de la Boost Date_Time Library
//-----------------------------------------------------------------------
//  Measure elapsed Time
//
//      sample usage :
//
//    Chrono chrono ;
//    Sleep(25) ;
//    ....
//    BOOST_REQUIRE( 20 < chrono.elapsed().total_milliseconds() ) ;

class Chrono {
public:
  Chrono() : _startTime(boost::posix_time::system_clock::local_time()) { ; }
  void reset() { _startTime = boost::posix_time::system_clock::local_time() ; }
  boost::posix_time::time_duration elapsed() const {
    return (boost::posix_time::system_clock::local_time() - _startTime) ;
  }
  boost::posix_time::ptime _startTime ;
} ;

La macro AL_CHECK_CHRONO_MS permet d'écrire des assertions concernant les temps d'exécution:

#define AL_CHECK_CHRONO_MS(CHRONO,MIN_MS,MAX_MS) \
{ using namespace boost::posix_time ; \
  time_duration d = CHRONO.elapsed() ; \
  BOOST_CHECK_MESSAGE( milliseconds(MIN_MS) <= d, \
    "test duration(ms), " << MIN_MS << " <= " << d. total_milliseconds() << " failed" ) ; \
  BOOST_CHECK_MESSAGE( d <= milliseconds(MAX_MS), \
    "test duration(ms), " << d.total_milliseconds() << " <= " << MAX_MS << " failed" ) ; \
}

Le Test Unitaire testChrono permet de tester la classe Chrono:

static void testChrono()
{
  Chrono cron ;
  ::Sleep(20) ;
  ACM_CHECK_CHRONO_MS(cron, 20, 100) ;
  ::Sleep(200) ;
  ACM_CHECK_CHRONO_MS(cron, 220, 500) ;
}