How do I measure time per thread in C?

戏子无情 提交于 2019-12-24 14:22:30

问题


I am working on a code with multiple number of threads and I want to print the time it took for me to complete task I assigned the i-th thread to do. Meaning I want to print the time each thread took to be done with the doSomeThing function

int main(int argc, char *argv[]){
   // ...
         i=0;
         while (i < NumberOfThreads){

              check = pthread_create(&(id_arr[i]), NULL, &doSomeThing, &data);

              i++;
         }
   // ...
}

void* doSomeThing(void *arg){
   // ...
}

if I add gettimeofday(&thread_start, NULL) before the pthread_create and then add gettimeofday(&thread_end, NULL) after the pthread_create, will I be actually measuring the time each thread took or just the time the main took? And if I put the gettimeofday inside the doSomething function wouldn't they create race-conditions?

If you have any idea on how to measure the time per thread please let me know, thank you.


回答1:


You can certainly use gettimeofday inside the thread function itself. Using local (stack) variables is completely thread-safe - every thread runs on its own stack (by definition).

void* doSomeThing(void *arg){
    struct timeval t0, t1, dt;

    gettimeofday(&t0, NULL);

    // do work

    gettimeofday(&t1, NULL);

    timersub(&t1, &t0, &dt);

    fprintf(stderr, "doSomeThing (thread %ld) took %d.%06d sec\n",
               (long)pthread_self(), dt.tv_sec, dt.tv_usec);
}

If you put the same code around pthread_create(), you would only see the amount of time it took for the thread to be created, not executed. If pthread_create blocked until the thread completed, there would be no point in ever using threads!




回答2:


gettimeofday() measures elapsed time. If you want to measure CPU time, try this:

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

uint64_t time_used ( ) {
   struct rusage ru;
   struct timeval t;
   getrusage(RUSAGE_THREAD,&ru);
   t = ru.ru_utime;
   return (uint64_t) t.tv_sec*1000 + t.tv_usec/1000;
}

...

uint64_t t1, t2;
t1 = time_used();
... do some work ...
t2 = time_used();
printf("used %d milliseconds\n",(unsigned)(t2-t1));

You will have to do that inside the thread. This is an example. Search time_used

Jonathon Reinhart uses timersub(), which simplifies things. I merge that in here:

void time_used ( struct timeval *t ) {
   struct rusage ru;
   getrusage(RUSAGE_THREAD,&ru);
   *t = ru.ru_utime;
}

...

struct timeval t0, t1, dt;
time_used(&t0);
... do some work ...
time_used(&t1);
timersub(&t1, &t0, &dt);

printf("used %d.%06d seconds\n", dt.tv_sec, dt.tv_usec);


来源:https://stackoverflow.com/questions/27718464/how-do-i-measure-time-per-thread-in-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!