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



我正在处理具有多个线程的代码,我想打印完成分配给第 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){
   // ...
}

如果我在pthread_create之前添加gettimeofday(&thread_start, NULL),然后在pthread_create之后添加gettimeofday(&thread_end, NULL),我实际上是在测量每个线程所花费的时间还是只是主要花费的时间?如果我把gettimeofday放在doSomething函数中,它们不会创造竞争条件吗?

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

您当然可以在线程函数本身中使用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 secn",
               (long)pthread_self(), dt.tv_sec, dt.tv_usec);
}

如果将相同的代码放在 pthread_create() 周围,则只能看到创建线程所花费的时间,而不是执行线程所花费的时间。如果在线程完成之前pthread_create阻塞,那么使用线程就没有意义了!

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 millisecondsn",(unsigned)(t2-t1));

您必须在线程内执行此操作。这是一个例子。搜索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 secondsn", dt.tv_sec, dt.tv_usec);

最新更新