Я работаю над ядром Linux 4.4 (Ubuntu) и сравниваю вывод между функцией times
(в sys / times.h) и функцией clock
(в time.h).
Согласно справочным страницам, times
должен возвращать "процессорное время", используемое программой, начиная с некоторого произвольного времени (но это произвольное время должно быть согласованным между вызовами функции).
Также согласнона страницы руководства clock
должно возвращать приблизительное время процессора, используемое программой.
В приведенном ниже коде каждый из этих вызовов используется для вывода количества времени, которое требуется для выполнения произвольной работы.Кажется, что эти времена должны выстроиться в линию, но они всегда кажутся отключенными в 10 000 раз.
#include <stdio.h>
#include <unistd.h>
#include <sys/times.h>
#include <time.h>
int main() {
struct tms times_start, times_end;
clock_t times_start_retval, times_end_retval;
clock_t clock_start, clock_end;
/* clock called first and last, so estimates using "clock" should be
slightly longer than estimates using "times" */
if((clock_start = clock()) == -1) {
perror("starting clock");
return -1;
}
if((times_start_retval = times(×_start)) == -1) {
perror("starting times");
return -1;
}
for(int i = 100000000; i; i--); // do work
if((times_end_retval = times(×_end)) == -1) {
perror("ending timer");
return -1;
}
if((clock_end = clock()) == -1) {
perror("ending clock");
return -1;
}
printf("Times using the clock system call\n");
printf("clock start: %li\nclock end: %li\n", clock_start, clock_end);
printf("elapsed: %li\n\n", clock_end - clock_start);
printf("Times using the times system call\n");
printf("System start: %li\nUser start: %li, start retval: %li\n",
times_start.tms_stime, times_start.tms_utime, times_start_retval);
printf("System end: %li\nUser end: %li, end retval: %li\n",
times_end.tms_stime, times_end.tms_utime, times_end_retval);
printf("elapsed: %li\n\n", times_end_retval - times_start_retval);
return 0;
}
Результат:
Times using the clock system call
clock start: 5016
clock end: 321323
elapsed: 316307
Times using the times system call
System start: 0
User start: 0, start retval: 1733759140
System end: 0
User end: 31, end retval: 1733759172
elapsed: 32
На основании описаний, онпохоже, что они должны вернуться в то же время.Тот факт, что это не так, заставляет меня задуматься о потенциальных проблемах переносимости.Почему эти времена разные?