如何测量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 sec\n", (long)pthread_self(), dt.tv_sec, dt.tv_usec); } 

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

gettimeofday()测量经过的时间 。 如果要测量CPU时间 ,请尝试以下操作:

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

你必须在线程中做到这一点。 这是一个例子。 搜索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);