Как измерить процессорное время процесса в C? - PullRequest
0 голосов
/ 26 мая 2020

Я хотел бы измерить время ЦП и пользователя, прошедшее между запуском процесса и отправкой сигнала SIGINT с помощью функции C times.

Однако при печати я просто получаю 0. Не вижу проблемы ..

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/times.h>
#include <signal.h> 

struct tms time_start;
struct tms time_end;

clock_t start;
clock_t end; 

void handle() { 
    times(&time_end);
    end = time_end.tms_stime;
} 

int main(int argc, char *argv[]) { 

    signal(SIGINT, handle);
    times(&time_start);
    start = time_start.tms_utime;
    pause(); 
    printf("end: %ld, start: %ld\n", (long) end, (long) start);

    return 0;
}

Это результат, который я получаю:

k@sc:dir$ ./my_time
^Cend: 0, start: 0

1 Ответ

0 голосов
/ 26 мая 2020

при печати Я просто получаю 0. Не вижу проблемы ..

tms_stime - время, затрачиваемое процессором в ядре от имени процесса. pause() ничего не делает, поэтому он не учитывается для процессорного времени, signal и times не требуют вычислений - ваша программа ничего не делает. Выполните некоторые операции ввода-вывода, заставьте это ядро ​​работать, чтобы увидеть некоторые изменения во времени.

Например, следующая программа читает 400000000 байт из /dev/urandom:

#include <time.h>
#include <sys/times.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>

struct tms time_end;

void handle() {
    times(&time_end);
}

int main(int argc, char *argv[]) {
    signal(SIGINT, handle);

    // read from urandom so that kernel has to generate randomness
    FILE *f = fopen("/dev/urandom", "r");
    for (int i = 0; i < 20000000; ++i) {
        char buf[20];
        fread(buf, sizeof(buf), 1, f);
    }
    fclose(f);

    pause();

    printf("tms_stime = %ld\n", (long)time_end.tms_stime);
    return 0;
}

Сохраняется как 1.c и выполняется в моей системе в выводах оболочки:

$ sh -c 'gcc 1.c ; ./a.out & child=$!; sleep 2; kill -INT $child ; wait'
tms_stime = 127

На linux есть также CLOCK_PROCESS_CPUTIME_ID, которые могут вас заинтересовать.

...