lines 462-546 of file: test_more/compare_c/det_by_minor.c

{xrst_begin elapsed_seconds_c app}

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
***********
{xrst_spell_off}
{xrst_code cpp} */
# 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
/* {xrst_code}
{xrst_spell_on}

{xrst_end elapsed_seconds_c}
