如何测量C中每个线程的时间?

时间:2014-12-31 08:40:50

标签: c multithreading time pthreads time-measurement

我正在研究一个包含多个线程的代码,我想打印完成任务所花费的时间,我分配了第i个线程。含义我想打印每个线程用doSomeThing函数完成的时间

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){
   // ...
}

如果我在gettimeofday(&thread_start, NULL)之前添加pthread_create,然后在gettimeofday(&thread_end, NULL)之后添加pthread_create,我是否会实际测量每个主题所花费的时间或主要时间拿?如果我将gettimeofday置于doSomething函数内,他们是否会创造竞争条件?

如果您对如何测量每个线程的时间有任何想法,请告诉我,谢谢。

2 个答案:

答案 0 :(得分:2)

你当然可以在线程函数本身内使用gettimeofday。使用本地(堆栈)变量是完全线程安全的 - 每个线程都在自己的堆栈上运行(根据定义)。

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);
}

如果在pthread_create()周围放置相同的代码,您只会看到线程创建所花费的时间,而不是执行。如果在线程完成之前阻塞pthread_create,那么永远不会使用线程!

答案 1 :(得分:2)

gettimeofday()衡量已用时间。如果您想测量 CPU时间,请尝试以下操作:

#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));

你必须在线程中做This is an example. Search time_used

Jonathon Reinhart使用timersub(),简化了事情。我在这里合并:

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);