getrusage возвращает нули в ru_utime.tv_usec и ru_utime.tv_sec

Для следующего кода getrusage возвращает нули в ru_utime.tv_usec и ru_utime.tv_sec .

Код:

 #include "stdlib.h" #include "stdio.h" #include "sys/time.h" #include "sys/resource.h" int getr_return, who = RUSAGE_SELF; struct rusage usage; main() { getr_return = getrusage(who, &usage); printf(" getr_return = %d\n", getr_return); printf(" time taken in seconds = %.61f\n", usage.ru_utime.tv_sec); printf(" time taken in seconds = %.61f\n", usage.ru_utime.tv_usec); Some_Mips_consuming_code(). getr_return = getrusage(who, &usage); printf(" getr_return = %d\n", getr_return); printf(" time taken in seconds = %.61f\n", usage.ru_utime.tv_sec); printf(" time taken in seconds = %.61f\n", usage.ru_utime.tv_usec); exit; } 

выход:

 getr_return = 0 time taken in seconds = 0.0000000000000000000000000000000000000000000000000000000000000 time taken in seconds = 0.0000000000000000000000000000000000000000000000000000000000000 getr_return = 0 time taken in seconds = 0.0000000000000000000000000000000000000000000000000000000000000 time taken in seconds = 0.0000000000000000000000000000000000000000000000000000000000000 

Скомпилированный код в Linux version 2.6.18-308

Ran исполняемый на плате ARM, и это Linux version 3.8.1-2.0

Время использования пользователя рассчитывается между двумя моментами логики, чтобы узнать время, которое должно иметь начало и конец использования timeval. Некоторые вещи, как ниже образца,

  struct timeval start, end; getrusage(RUSAGE_SELF, &usage); start = usage.ru_utime; /* Code to check the usage consumed */ getrusage(RUSAGE_SELF, &usage); end = usage.ru_utime; 

ru_utime & ru_stime имеют структуры типа timeval . Если вы посмотрите его заявление, то оба члена tv_sec & tv_usec имеют тип long . Поэтому при печати на %ld измените спецификатор формата. Обратите внимание, что при успешном getrusage() возвращает 0 .

Измерение времени ограничено точностью, разрешением и точностью. Время чтения (7) . Не ожидайте значительных мер для расчета меньше, чем, например, полсекунды.

Часто измерение времени CPU выполняется путем подсчета миганий или таймерных прерываний (связанных с HZ если у вас есть один в вашем ядре).

Поскольку вы вызываете getrusage (2) в начале вашего main , перед ним не так много вычислений (в основном, только предварительная инициализация, например, crt0.o ). Поэтому вы должны ожидать, что он будет близок к нулю.

Вы можете попробовать использовать clock_gettime (2) с CLOCK_REALTIME или CLOCK_PROCESS_CPUTIME_ID .