Определить пользовательское и системное время, используемое потоком - PullRequest
3 голосов
/ 03 августа 2010

У нас есть механизм рабочих процессов на основе qthreads, в котором рабочие потоки выбирают пакеты входных данных, когда они помещаются в очередь, а затем помещают свои выходные данные в другую очередь, чтобы другие рабочие потоки могли запустить следующий этап; и так далее, пока все входные данные не будут использованы и все выходные данные будут сгенерированы.

Как правило, несколько потоков будут выполнять одну и ту же задачу, а другие будут выполнять другие задачи одновременно. Мы хотим сравнить производительность этих многопоточных задач с целью оптимизации.

Легко получить реальное (истекшее) время, которое занял данный поток, выполняя данную задачу. Мы просто рассмотрим разницу между возвращаемыми значениями функции POSIX times () в начале и в конце процедуры run () потока. Тем не менее, я не могу понять, как получить соответствующее пользовательское и системное время. Получение их из struct tms, которое вы передаете в times (), не работает, потому что эта структура дает общее пользовательское и системное время всех потоков, запущенных, когда рассматриваемый поток активен.

1 Ответ

1 голос
/ 27 октября 2010

Предполагая, что это в Linux, как насчет getrusage () с RUSAGE_THREAD?Solaris также предлагает RUSAGE_LWP, который аналогичен, и я думаю, что, вероятно, есть эквиваленты для других POSIX-подобных систем.

Грубый пример:

#define _GNU_SOURCE
#include <sys/time.h>
#include <sys/resource.h>
#include <stdio.h>
#include <pthread.h>
#include <assert.h>
#include <unistd.h>

struct tinfo {
  pthread_t thread;     
  int id;
  struct rusage start;
  struct rusage end;
};

static void *
thread_start(void *arg)
{
  struct tinfo *inf = arg;
  getrusage(RUSAGE_THREAD, &inf->start);
  if (inf->id) {
     sleep(10);
  }
  else {
     const time_t start = time(NULL);
     while (time(NULL) - start < 10); // Waste CPU time!
  }
  getrusage(RUSAGE_THREAD, &inf->end);
  return 0;
}

int main() {
  static const int nrthr = 2;
  struct tinfo status[nrthr];
  for (int i = 0; i < nrthr; ++i) {
     status[i].id = i;
     const int s = pthread_create(&status[i].thread, 
                                            NULL, &thread_start, 
                                            &status[i]);
     assert(!s);
  }

  for (int i = 0; i < nrthr; ++i) {
     const int s = pthread_join(status[i].thread, NULL);
     assert(!s);
     // Sub-second timing is available too
     printf("Thread %d done: %ld (s) user, %ld (s) system\n", status[i].id, 
              status[i].end.ru_utime.tv_sec - status[i].start.ru_utime.tv_sec, 
              status[i].end.ru_stime.tv_sec - status[i].start.ru_stime.tv_sec);
  }  
}

Я думаю, что нечто подобное возможно в окнах с использованием GetProcessTimes ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...