kylemanna
4/5/2012 - 9:29 PM

Simple timer for an ugly loop

Simple timer for an ugly loop

#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <sched.h>
#include <string.h>

double diff(struct timespec *start, struct timespec *end)
{
    struct timespec temp;
    if ((end->tv_nsec-start->tv_nsec)<0) {
        temp.tv_sec = end->tv_sec-start->tv_sec-1;
        temp.tv_nsec = 1000000000+end->tv_nsec-start->tv_nsec;
    } else {
        temp.tv_sec = end->tv_sec-start->tv_sec;
        temp.tv_nsec = end->tv_nsec-start->tv_nsec;
    }   
    return (double)temp.tv_sec + (double)temp.tv_nsec / 1000000000.0;
}

int main()
{
    struct timespec time1, time2;
    int msg_cnt = 0;
    struct sched_param schedparm;

    memset(&schedparm, 0, sizeof(schedparm));
    schedparm.sched_priority = 1; // lowest rt priority
    sched_setscheduler(0, SCHED_FIFO, &schedparm);

    clock_gettime(CLOCK_REALTIME, &time1);
    while (1) {

        usleep(1000);
    
        if (++msg_cnt >= 1000) {
            double rate, et; 

            clock_gettime(CLOCK_REALTIME, &time2);

            et = diff(&time1, &time2);
            rate = msg_cnt / et; 

            printf("msgs = %d, et = %f, msgs/s = %f\n", msg_cnt, et, rate);
            msg_cnt = 0;
            time1.tv_sec = time2.tv_sec;
            time1.tv_nsec = time2.tv_nsec;
        }   
    }   

    return 0;
}