Solved

What is the most accurate timer on a unix system?

Posted on 2004-04-09
5
1,581 Views
Last Modified: 2012-06-21
I am simulating the datalink layer between two  entities in a network.

I need to get down to microseconds if possible.

I'm compiling c code on a the gcc compiler.

I basically need to do this.

StartTime = getTime();


loop(   )
{
........
  CurrentTime = getTime();
  if(CurrentTime - StartTime > 50 microseconds)
  {
     do this;
  }
  ......
}


Any ideas on the best timer function to use?

Thank you.
0
Comment
Question by:oxygen_728
5 Comments
 
LVL 23

Assisted Solution

by:brettmjohnson
brettmjohnson earned 150 total points
Comment Utility
Although gettimeofday() supports microsecond resolution, the clocks on most
machines do not tick more than a few hundred times per second, causing the
returned microsecond values from gettimeofday() to jump by large quanta.
0
 
LVL 3

Assisted Solution

by:idt
idt earned 150 total points
Comment Utility
Like Brett.. said, gettimeofday supports usec resolution, but diiferent systems may jump by large increments, run the following test app to test your system.

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

/*
const char* TimeToString(const struct tm* t) {
  static char buf[30];
  strftime(buf,sizeof(buf),"%Y-%m-%d %H:%M:%S",t);
  return buf;
}

const char* FormatTime(const struct timeval* v) {
  static char buf[128];
  struct tm t;
  localtime_r(&v->tv_sec, &t);
  sprintf(buf,"%s.%ld", TimeToString(&t),v->tv_usec);
  return buf;
}
*/

void difftimeval(const struct timeval* v, const struct timeval* w, struct timeval *r) {
  r->tv_sec=(v->tv_sec - w->tv_sec);
  r->tv_usec=(v->tv_usec - w->tv_usec);
  return;
}

int main(void) {
  int i;
  struct timeval v,w,r;
  gettimeofday(&w,0);
  for(i=0;i<10;i++) {
    gettimeofday(&v,0);
    difftimeval(&v,&w,&r);
    //printf("time is now:%s  elapsed:%ld seconds, %ld usecs\n",FormatTime(&v),r.tv_sec,r.tv_usec);
    printf("elapsed:%ld seconds, %ld usecs\n",r.tv_sec,r.tv_usec);
    memcpy(&w,&v,sizeof(v));
  }
  return 0;
}

My output is:

elapsed:0 seconds, 1 usecs
elapsed:0 seconds, 56 usecs
elapsed:0 seconds, 4 usecs
elapsed:0 seconds, 4 usecs
elapsed:0 seconds, 3 usecs
elapsed:0 seconds, 4 usecs
elapsed:0 seconds, 3 usecs
elapsed:0 seconds, 4 usecs
elapsed:0 seconds, 3 usecs
elapsed:0 seconds, 3 usecs

Unremark for more verbose date/time output
time is now:2004-04-10 00:17:53.583650  elapsed:0 seconds, 1 usecs
time is now:2004-04-10 00:17:53.583863  elapsed:0 seconds, 213 usecs
time is now:2004-04-10 00:17:53.583872  elapsed:0 seconds, 9 usecs
time is now:2004-04-10 00:17:53.583880  elapsed:0 seconds, 8 usecs
time is now:2004-04-10 00:17:53.583888  elapsed:0 seconds, 8 usecs
time is now:2004-04-10 00:17:53.583895  elapsed:0 seconds, 7 usecs
time is now:2004-04-10 00:17:53.583902  elapsed:0 seconds, 7 usecs
time is now:2004-04-10 00:17:53.583909  elapsed:0 seconds, 7 usecs
time is now:2004-04-10 00:17:53.583917  elapsed:0 seconds, 8 usecs
time is now:2004-04-10 00:17:53.583924  elapsed:0 seconds, 7 usecs

compiled with gcc version 3.2.2 (Mandrake Linux 9.1 3.2.2-3mdk)

Daniel
0
 
LVL 45

Accepted Solution

by:
sunnycoder earned 200 total points
Comment Utility
Hi oxygen_728,

minimum assured accuracy that you get from a userspace function on linux is 10ms

However you can use one of the following depending on your needs:

1. use assembly language programming to read the timestamp counter directly
The P3 has a 64-bit timestamp counter that counts cpu clock ticks. Here's how to read out the low 32 bits with gcc:

unsigned int rdtsc()
{
     unsigned int high, low;

     __asm__ __volatile__ ("rdtsc" : "=a" (low), "=d" (high));
     return low;
}

The low bits wrap quite quickly, but should work fine for measuring subsecond intervals. One caveat, the TSC is global, so you might end up counting ticks spend in interrupts and other processes.
You can use a similar instruction for your hardware.

2. There is a do_gettimeofday() function availbale inside the kernel ... It has better than microsecond resolution and provides it too !!

3. Use times() or gettimeofday() or clock() function ... But you can get results delayed by upto 10ms .... btw, clock function was meant to measure time taken by the program ...
man 2 times
man gettimeofday
man clock

sunnycoder
0
 

Author Comment

by:oxygen_728
Comment Utility
Thanks for the help!
0
 
LVL 3

Expert Comment

by:idt
Comment Utility
You had posted two identical questions,

One in unix_programming and one in c language.
You accepted my answer in unix_programming language and gave brettmjohnson an assist.
You accepted sunnycoder's answer in c language an gave both brettmjohnson and I an assist.

While your actions are beyone reproach, a true gentleman, you did needlessly spend 500 points that were not required.  You can always post a link to a question in another TA for a small number of points.

Eg. 20 point, Link to 500 point unix question in C.

If this was totally intentional because of the urgency of your request, so be it., however, if this was unintentional, I have no objection to you requesting an adjustment, and having points of the unix_programming question reduced to a small number, does brettmjohnson concur?

Incedently, out of plain curiosity, did you run my test app, and what was the results on your platform?

Daniel
0

Featured Post

Highfive Gives IT Their Time Back

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Summary: This tutorial covers some basics of pointer, pointer arithmetic and function pointer. What is a pointer: A pointer is a variable which holds an address. This address might be address of another variable/address of devices/address of fu…
This is a short and sweet, but (hopefully) to the point article. There seems to be some fundamental misunderstanding about the function prototype for the "main" function in C and C++, more specifically what type this function should return. I see so…
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use for-loops in the C programming language.
The goal of this video is to provide viewers with basic examples to understand and use switch statements in the C programming language.

743 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now