Re: waittime function precision

Buck Calabro <[email protected]>
Newsgroups gmane.comp.lang.as400.c
Organization midrange.com
Message-ID <[email protected]>
On 4/16/2014 3:39 AM, Jevgeni Astanovski wrote:
> I tried what you said (_WAIT_MPL_SET)
> Results are pretty similar:
> Delay = 10 ms, waittime: 18.480 ms 
> Delay = 20 ms, waittime: 38.960 ms 
> Delay = 30 ms, waittime: 59.432 ms 
> Delay = 40 ms, waittime: 52.360 ms 
> Delay = 50 ms, waittime: 69.720 ms 
> Delay = 60 ms, waittime: 89.440 ms 
> Delay = 70 ms, waittime: 69.824 ms 
> Delay = 80 ms, waittime: 91.824 ms 
> Delay = 90 ms, waittime: 119.128 ms
> 
> Actually I do not expect that waittime is somewhat precise in milliseconds range - at least I see it isn't.
> If you tell her to wait for a minute, you probably do not care about +/- 20ms!
> 
> But is there something that works reasonably in a milliseconds range?

I normally think of usleep() but that is not precise on IBM i either.
Here are some runs I did:

Delay = 10 ms, waittime: 20.024 ms
Delay = 20 ms, waittime: 40.016 ms
Delay = 30 ms, waittime: 60.024 ms
Delay = 40 ms, waittime: 70.024 ms
Delay = 50 ms, waittime: 71.920 ms
Delay = 60 ms, waittime: 74.640 ms
Delay = 70 ms, waittime: 100.024 ms
Delay = 80 ms, waittime: 110.024 ms
Delay = 90 ms, waittime: 120.024 ms

Delay = 10 ms, waittime: 10.072 ms
Delay = 20 ms, waittime: 40.024 ms
Delay = 30 ms, waittime: 38.376 ms
Delay = 40 ms, waittime: 41.104 ms
Delay = 50 ms, waittime: 80.024 ms
Delay = 60 ms, waittime: 66.120 ms
Delay = 70 ms, waittime: 72.312 ms
Delay = 80 ms, waittime: 110.024 ms
Delay = 90 ms, waittime: 120.032 ms

Delay = 10 ms, waittime: 12.648 ms
Delay = 20 ms, waittime: 40.024 ms
Delay = 30 ms, waittime: 31.712 ms
Delay = 40 ms, waittime: 70.024 ms
Delay = 50 ms, waittime: 57.080 ms
Delay = 60 ms, waittime: 77.936 ms
Delay = 70 ms, waittime: 74.416 ms
Delay = 80 ms, waittime: 109.944 ms
Delay = 90 ms, waittime: 120.016 ms

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <decimal.h>

int main (int argc, char *argv[])
{
  struct timeval tp1, tp2 ;
  struct timezone tpz ;
  decimal (9,3) Duration ;
  decimal (19,6) StartTime, EndTime ;
  int i ;

  useconds_t useconds ;

  for (i = 1; i < 10; i++)
  {
    gettimeofday(&tp1, &tpz) ;
    StartTime = tp1.tv_usec ;
    StartTime = tp1.tv_sec + (StartTime / 1000000D) ;

    useconds = i * 10000 ;  /* 10ms = 10 000us */
    usleep(useconds) ;

    gettimeofday(&tp2, &tpz) ;
    EndTime = tp2.tv_usec ;
    EndTime = tp2.tv_sec + (EndTime / 1000000D) ;
    Duration = (decimal (9,3)) ((EndTime - StartTime) * 1000D) ;
    printf("Delay = %d ms, waittime: %D(9,3) ms\n", i * 10, Duration) ;
  }
  return(0);
}

I tried it on Cygwin running on Windows 7.  Cygwin doesn't have decimal
so I had to make some changes:

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>

int main (int argc, char *argv[])
{
  struct timeval tp1, tp2 ;
  struct timezone tpz ;
  int Duration ;
  int StartTime, EndTime ;
  int i ;

  useconds_t useconds ;

  for (i = 1; i < 10; i++)
  {
    gettimeofday(&tp1, &tpz) ;
    StartTime = tp1.tv_usec ;

    useconds = i * 10000 ;  /* 10ms = 10 000us */
    usleep(useconds) ;

    gettimeofday(&tp2, &tpz) ;
    EndTime = tp2.tv_usec ;
    Duration = EndTime - StartTime ;
    printf("Delay = %d ms, waittime: %d us\n", i * 10, Duration) ;
  }
  return(0);
}

$ ./usleep
Delay = 10 ms, waittime: 11001 us
Delay = 20 ms, waittime: 20001 us
Delay = 30 ms, waittime: 30002 us
Delay = 40 ms, waittime: 40002 us
Delay = 50 ms, waittime: 50003 us
Delay = 60 ms, waittime: 60003 us
Delay = 70 ms, waittime: 70004 us
Delay = 80 ms, waittime: 80005 us
Delay = 90 ms, waittime: 96006 us

$ ./usleep
Delay = 10 ms, waittime: 15001 us
Delay = 20 ms, waittime: 22001 us
Delay = 30 ms, waittime: 30002 us
Delay = 40 ms, waittime: 40002 us
Delay = 50 ms, waittime: 50003 us
Delay = 60 ms, waittime: 60004 us
Delay = 70 ms, waittime: 70004 us
Delay = 80 ms, waittime: 80004 us
Delay = 90 ms, waittime: 90005 us


I guess that we can't expect an operating system that is optimised for
database operations to honour precise timings in the same way that an
embedded processor or even Windows will.  :-(

  --buck
-- 
This is the Bare Metal Programming IBM i (AS/400 and iSeries) (C400-L) mailing list
To post a message email: C400-L-Zwy7GipZuJhWk0Htik3J/[email protected]
To subscribe, unsubscribe, or change list options,
visit: http://lists.midrange.com/mailman/listinfo/c400-l
or email: C400-L-request-Zwy7GipZuJhWk0Htik3J/[email protected]
Before posting, please take a moment to review the archives
at http://archive.midrange.com/c400-l.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.