Установите time_t в миллисекунды

У меня есть функция, и я хочу, чтобы она перестала работать, если она работает в течение определенного количества миллисекунд. Эта функция работает в течение нескольких секунд, но я хочу проверить ее на миллисекунды. Как мне это сделать? Если я установлю исключить = 1, это соответствует 1 секунде. Как установить исключение = 5 мс?

Функция:

void clsfy_proc(S_SNR_TARGET_SET pSonarTargetSet, unsigned char *target_num, time_t eliminate)
{

    // get timing
    time_t _start = time(NULL);
    time_t _end = _start + eliminate;
    int _eliminate = 0;

    //some code

        time_t start = time(NULL);
        time_t end = start + eliminate;

        for(_tidx = 0; _tidx < pSonarTargetSet[_i].num; _tidx++) {
            // check timing
            time_t _current = time(NULL);
            if (_current > _end) {
                printf("clsfy_proc(1), Eliminate due to timeout\n");
                _eliminate = 1;
                break;
            }

            //some code 

        if (_eliminate == 1)
            break;
    }
    //some code 
}

2 ответа

Решение

time_t абсолютное время, представленное как целое число секунд с начала эпохи UNIX (полночь по Гринвичу, 1 января 1970 года). Это полезно как однозначное, простое в работе представление точки во времени.

clock_t представляет собой относительное измерение времени, представленное целым числом тактов с некоторого момента времени (возможно, при загрузке компьютера, но без гарантий, так как оно может часто переворачиваться). Есть такты часов CLOCKS_PER_SEC в секунду; значение этой константы может варьироваться в зависимости от операционной системы. Это иногда используется для целей синхронизации, но это не очень хорошо из-за его относительно низкого разрешения.

Один маленький пример для clock_t:

#include <time.h>
#include <stdio.h>

int main () {
   clock_t start_t, end_t, total_t;
   int i;

   start_t = clock();
   printf("Starting of the program, start_t = %ld\n", start_t);

   for(i=0; i< 10000000; i++) { }

   end_t = clock();
   printf("End of the big loop, end_t = %ld\n", end_t);

   total_t = (double)(end_t - start_t) / CLOCKS_PER_SEC;
   printf("Total time taken by CPU: %f\n", total_t  );

   return(0);
}

Вы можете использовать getrusage(). Пожалуйста, смотрите пример:

Источник: http://www.cs.tufts.edu/comp/111/examples/Time/getrusage.c

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

///////////////////////////////////
// measure user and system time using the "getrusage" call. 
///////////////////////////////////
//struct rusage {
//   struct timeval ru_utime; /* user CPU time used */
//   struct timeval ru_stime; /* system CPU time used */
//   long   ru_maxrss;        /* maximum resident set size */
//   long   ru_ixrss;         /* integral shared memory size */
//   long   ru_idrss;         /* integral unshared data size */
//   long   ru_isrss;         /* integral unshared stack size */
//   long   ru_minflt;        /* page reclaims (soft page faults) */
//   long   ru_majflt;        /* page faults (hard page faults) */
//   long   ru_nswap;         /* swaps */
//   long   ru_inblock;       /* block input operations */
//   long   ru_oublock;       /* block output operations */
//   long   ru_msgsnd;        /* IPC messages sent */
//   long   ru_msgrcv;        /* IPC messages received */
//   long   ru_nsignals;      /* signals received */
//   long   ru_nvcsw;         /* voluntary context switches */
//   long   ru_nivcsw;        /* involuntary context switches */
//};

//struct timeval
//  {
//    long int tv_sec;       /* Seconds.  */
//    long int tv_usec;      /* Microseconds.  */
//  };


main () { 
    struct rusage buf; 
    // chew up some CPU time
    int i,j; for (i=0,j=0; i<100000000; i++) { j+=i*i; }     
    getrusage(RUSAGE_SELF, &buf); 
    printf("user seconds without microseconds: %ld\n", buf.ru_utime.tv_sec); 
    printf("user microseconds: %ld\n", buf.ru_utime.tv_usec); 
    printf("total user seconds: %e\n", 
       (double) buf.ru_utime.tv_sec 
     + (double) buf.ru_utime.tv_usec / (double) 1000000); 
} 
Другие вопросы по тегам