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
Запустил исполняемый файл на плате ARM, и это Linux version 3.8.1-2.0
2 ответа
Время использования пользователя вычисляется между двумя моментами логики, чтобы определить потребляемое время, которое должно иметь время начала и окончания использования. Некоторые вещи, как ниже образец,
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). Не ожидайте значительных измерений для вычисления меньше, чем, например, полсекунды.
Часто измерение времени ЦП выполняется путем подсчета времени ожидания или прерываний таймера (связанных сHZ
если у вас есть один в вашем ядре).
Так как вы вызываете getrusage(2) в начале вашего main
не так много вычислений произошло до этого (в основном, только доmain
инициализация в напримерcrt0.o
). Таким образом, вы должны ожидать, что он будет около нуля.
Вы можете попробовать использовать clock_gettime(2) с CLOCK_REALTIME
или же CLOCK_PROCESS_CPUTIME_ID
,