LINUX.ORG.RU

getrusage


0

0

Хочется узнать, сколько процесс потратил процессорного времени за свое выполнение. Пока балюусь так: 

#include <sys/time.h> 
#include <sys/types.h> 
#include <sys/resource.h> 
#include <math.h> 
#include <time.h>

#define MAXCOUNT 10000
int main () { 
  int i, j, count, total;
  struct rusage rsr_usage; 
  clock_t start, end; 
  double cpu_time_used; 
  start = clock();

  total = 0; 
  getrusage(RUSAGE_SELF, &rsr_usage);
  for (i = 2; total <= MAXCOUNT; i++)
      { /*SKIPPED HEAWY WORK*/ } 
  getrusage(RUSAGE_SELF, &rsr_usage); 
  end = clock(); 
  cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
  printf("\tgetrusage %.8f \n", (rsr_usage.ru_stime.tv_sec * 1000) +   (rsr_usage.ru_stime.tv_usec / 1000));
  printf("\tuser time clocks() %.8 f\n", cpu_time_used);
  return 0; 
}

в результате имеем: 
ubique@ubique ~/dev/files $ time ./badscript 
getrusage -0.00000000 
user time clocks() 0.28000000

real 0m0.325s
user 0m0.288s
sys 0m0.000s

Те, когда считаем через clocks, у нас получается верно. А вот с getrusage..

Ответ на: комментарий от dilmah

Те, в окружении ядра процесс вообще не выполняется? Я пробовал и с stime, результат был тот же. Причем time показывал, что в окружении ядра процесс провел несколько секунд, а time и stime были нулевыми.

Ubique
() автор топика
Ответ на: комментарий от Ubique

0 секунды умножил на 1000, 288 миллисекунд разделил на 1000 и сложил.

mv ★★★★★
()

Плюс нужно учитывать utime и stime. При выполнении системного вызова процесс находится в kernel space, накручивается stime.

mv ★★★★★
()
Ответ на: комментарий от mv

Все равно не понятно:(
Переделал так
<skipped>
  getrusage(RUSAGE_SELF, &rsr_usage);
  end = clock();
  cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
  printf("system time %.8f\n", (rsr_usage.ru_stime.tv_sec + rsr_usage.ru_stime.tv_usec*1000000));
  printf("user time %.8f\n", (rsr_usage.ru_utime.tv_sec +rsr_usage.ru_utime.tv_usec*1000000));
  printf("\tuser time clocks() %.8f \n", cpu_time_used);
  return 0;
}

tv_usec - микросекунды, должно получится время в секундах в окружении ядра и пользователя соответственно. Однако:

ubique@ubique ~/dev $ time ./badscript
system time -0.80002975
user time -0.80003001
        user time clocks() 1.43000000 

real    0m1.436s
user    0m1.436s
sys     0m0.000s

ubique@ubique ~/dev $ time ./badscript
system time -0.01673996
user time -0.01673997
        user time clocks() 1.43000000 

real    0m1.432s
user    0m1.432s
sys     0m0.000s

ubique@ubique ~/dev $ time ./badscript
system time -0.37748528
user time -0.37748542
        user time clocks() 1.43000000 

real    0m1.435s
user    0m1.432s
sys     0m0.000s

Возникает несколько вопросов : 
1) Почему значения stime и utime все таки так похожи.
2) Почему значения getrusage никак не кореллируют со значениями time.
3) Где я дурак?

Ubique
() автор топика
Ответ на: комментарий от Ubique

Явное приведение аргументов у printf сделай. У тебя арифметика неправильно отрабатывает, лучше всем элементам при сложении тип явно указывай.

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.