Re: waittime function precision

Ron Unknown <[email protected]>
Newsgroups gmane.comp.lang.as400.c
Message-ID <[email protected]>
So, there is a 10 ms overhead roughly on iOS but under load I guess that will vary.

> To: c400-l-Zwy7GipZuJhWk0Htik3J/[email protected]
> From: [email protected]
> Date: Wed, 16 Apr 2014 10:00:40 -0400
> Subject: Re: [C400-L] waittime function precision
> 
> 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.
> 
 		 	   		  
-- 
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.