elapsed_seconds_c

View page source

Returns Elapsed Number of Seconds

Syntax

s = elapsed_seconds ()

Purpose

This routine is accurate to within .02 seconds It does not necessary work for time intervals that are greater than a day.

s

is a double equal to the number of seconds since the first call to elapsed_seconds .

Source Code

# if _MSC_VER
// ---------------------------------------------------------------------------
// Microsoft version of timer
# ifndef NOMINMAX
# define NOMINMAX  // so windows.h does not define min and max as macros
# endif
# include <windows.h>
# include <cassert>
double elapsed_seconds(void)
{  static bool       first_  = true;
   static SYSTEMTIME st_;
   double hour, minute, second, milli, diff;
   SYSTEMTIME st;

   if( first_ )
   {  GetSystemTime(&st_);
      first_ = false;
      return 0.;
   }
   GetSystemTime(&st);

   hour   = (double) st.wHour         - (double) st_.wHour;
   minute = (double) st.wMinute       - (double) st_.wMinute;
   second = (double) st.wSecond       - (double) st_.wSecond;
   milli  = (double) st.wMilliseconds - (double) st_.wMilliseconds;

   diff   = 1e-3*milli + second + 60.*minute + 3600.*hour;
   if( diff < 0. )
      diff += 3600.*24.;
   assert( 0 <= diff && diff < 3600.*24. );

   return diff;
}
# else
// ---------------------------------------------------------------------------
// Unix version of timer
# include <sys/time.h>
double elapsed_seconds(void)
{  double sec, usec, diff;

   static bool first_ = true;
   static struct timeval tv_first;
   struct timeval        tv;
   if( first_ )
   {  gettimeofday(&tv_first, NULL);
      first_ = false;
      return 0.;
   }
   gettimeofday(&tv, NULL);
   assert( tv.tv_sec >= tv_first.tv_sec );

   sec  = (double)(tv.tv_sec -  tv_first.tv_sec);
   usec = (double)tv.tv_usec - (double)tv_first.tv_usec;
   diff = sec + 1e-6*usec;

   return diff;
}
# endif