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,

Другие вопросы по тегам