【问题标题】:How do I measure time per thread in C?如何在 C 中测量每个线程的时间?
【发布时间】:2014-12-31 08:40:49
【问题描述】:

我正在编写具有多个线程的代码,我想打印我完成分配给第 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(&amp;thread_start, NULL),然后在pthread_create 之后添加gettimeofday(&amp;thread_end, NULL),我会实际测量每个线程所用的时间还是只是主线程所用的时间?如果我将gettimeofday 放在doSomething 函数中,它们不会创建竞争条件吗?

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

【问题讨论】:

    标签: c multithreading time pthreads time-measurement


    【解决方案1】:

    您当然可以在线程函数本身中使用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 在线程完成之前一直阻塞,那么使用线程就没有意义了!

    【讨论】:

      【解决方案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);
      

      【讨论】:

      • 我想我应该测量经过的时间,但我会仔细检查,如果不是,那么我一定会执行你的建议,谢谢。
      猜你喜欢
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2017-12-01
      • 1970-01-01
      相关资源
      最近更新 更多